我试图在外类声明的括号(泛型)中插入一个私有类,并得到下一个错误:“com.example.gridrecyclerview.RecycleViewAdapter。VieHolder在com.example.gridrecyclerview.RecyclViewAdapter中有私有访问权限”
将内部类更改为公共类时,一切正常。谁能给我解释一下这个问题吗。附件代码:
package com.example.gridrecyclerview;
import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
import java.util.Random;
public class RecyclerViewAdapter extends RecyclerView.Adapter <RecyclerViewAdapter.ViewHolder> {
Context context;
List<ModelItem> modelItemList;
public RecyclerViewAdapter(Context context, List<ModelItem> modelItemList)
{
this.context = context;
this.modelItemList = modelItemList;
}
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(context).inflate(R.layout.rc_item,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
{
Log.e("onBindViewHolder ","onBindViewHolder");
ModelItem modelItem = modelItemList.get(position);
holder.firstNameTextView.setText(modelItem.getFirstName());
holder.secondNameText.setText(modelItem.getLastName());
}
@Override
public int getItemCount()
{
return modelItemList.size();
}
private class ViewHolder extends RecyclerView.ViewHolder
{
TextView firstNameTextView;
TextView secondNameText;
public ViewHolder(@NonNull View itemView)
{
super(itemView);
firstNameTextView = itemView.findViewById(R.id.first_name);
secondNameText = itemView.findViewById(R.id.second_name);
}
}
}
根据Java Spec Page-164中的可访问性规则,声明的私有成员只能在顶级类的主体中访问。我希望课程的主体不是指它的定义。
**否则,该成员或构造函数被声明为私有,并且只有当且仅当它发生在包含该成员或构造函数声明的顶级类(§7.6)的主体内时,才允许访问**
您不能这样做,因为您正在将私有类传递给“RecyclerView.Adapter”类。换句话说,ViewHolder类仅在RecycleServiceAdapter类中可用。
PS:您可以将这个类创建为一个新类,然后将其传递给“RecyclerView.Adapter”类或将其更改为公共范围。
要回答这个问题,您应该知道在Java中使用泛型时幕后发生了什么,泛型在编译时被检查,并且在运行时没有泛型类型,这称为类型擦除,当您编译程序时,所有泛型都是它们特定类型的种姓。想象一下您的RecyclView。Adapter
类如下:
public class Adapter<T> {
T view;
public T getView() {
return view;
}
public void setView(T view) {
this.view = view;
}
}
想象一下,您像以前一样定义了RecycleServiceAdapter
类:
现在让我们从两个角度来讨论这个问题:
作为程序员,想象一下在另一个类中的某个地方,您创建了一个RecycleServiceAdapter
类的实例,如下所示,并对该对象调用getView()
RecyclerViewAdapter recycler = RecyclerViewAdapter();
? object = recycler.getView()
你放在这里而不是什么类型的对象?显然你不能放RecyclViewAdapter。ViewHolder
因为它对于RecyclViewAdapter
是私有的,您不能在其他地方使用它。
现在让我们从编译器的角度来考虑这个问题:
编译泛型时,编译器使用擦除,并将代码编译为如下内容:
RecyclerViewAdapter recycler = RecyclerViewAdapter();
? object = (RecyclerViewAdapter.ViewHolder)recycler.getView();
在这里,您可以看到编译器在编译时((RecycleServiceAdapter.ViewHolder)recycler)强制转换对象的类型。getView()
)。但编译器有可能在这里做这样的事情吗?
当然不是因为RecycleServiceAdapter。ViewHolder
是RecycleServiceAdapter
类的私有代码,而此代码是在另一个类中编写的。
问题内容: 我观察到外部类可以访问内部类的私有实例变量。这怎么可能?这是演示相同代码的示例代码: 为什么允许这种行为? 问题答案: 内部类只是一种将真正属于原始外部类的功能完全分开的方法。当你有两个要求时,可以使用它们: 如果是在单独的类中实现的,那么外部类中的某些功能将最为清晰。 即使在单独的类中,该功能也与外部类的工作方式紧密相关。 鉴于这些要求,内部类可以完全访问其外部类。由于它们基本上是外
这可能是一个愚蠢的问题,但是我很惊讶地看到,在外部类中不允许使用私有内部类作为泛型类型。 如果我使内部类受到保护,它编译得很好。 此外,我还必须精确而不仅仅是,否则找不到内部类。这看起来也有点奇怪。 为什么内心不能是私密的?为什么它被允许受到保护? 错误是: 我使用的是JavaSE17,但我认为它并没有太大用处。
为什么我不能这样做/是否有解决方法来实现这一点: 这两个编译错误是 > On
为什么这段代码不起作用 在这段代码工作的时候? 在第一段代码中,当我试图通过内部类“a”的对象引用内部类“a”的实例变量“x”时,我得到一个错误,说我是在静态上下文中使用内部类。在其他方法中执行相同操作时没有错误。
问题内容: 因此,我们大多数人都知道 如何 从内部类访问外部类。用这些词进行搜索会给出关于该主题的大量回答问题。但是我想知道的是为什么语法是这样。 例: 为什么呢?看起来是A类的静态字段,但是… 感到困惑 如果这是重复的话,请原谅我。就像我说的那样,用这些词进行搜索会给出操作答案。 问题答案: 为什么这样做呢?真的,只是因为它的方式。它行之有效,从某种意义上讲,并且不需要花哨的语法来完成这项工作。
问题内容: 如果仍然无法在包含类的外部访问它,则用Java声明一个私有内部类的成员的原因是什么?可以吗 问题答案: 如果该类没有扩展任何类或实现任何接口,那么我认为这是无稽之谈,因为没有其他类可以访问它的任何实例。 但是,如果它扩展或实现了任何其他非私有类或接口,则是有意义的。一个例子: