在当前情况下无法访问

我有以下代码

public abstract class BaseAdapter<T, V extends BaseAdapter.ViewHolder> extends ArrayAdapter<T> { public BaseAdapter(Context context, int resource, Collection<T> collection) { // typical constructor logic } // some other custom defined methods public static class ViewHolder { // custom defined logic } } public class ModelAdapter extends BaseAdapter<Model, ModelAdapter.ModelViewHolder> { public ModelAdapter(Context context, int resource, Collection<Model> collection) { super(context, resource, collection); // typical constructor logic } public static class ModelViewHolder extends ViewHolder { // custom defined logic } } 

BaseAdapter和ModelAdapter是分开的文件。 问题是我试图定义ModelAdapter时遇到编译错误:ModelViewHolder 在当前上下文中不可访问

我真的不明白这个错误,不知道我做错了什么。 有人可以向我解释这个问题或一个可能澄清这种情况的链接吗?

Solutions Collecting From Web of "在当前情况下无法访问"

创造死锁

您使用ModelAdapter.ModelViewHolder作为ModelAdapter.ModelViewHolder的模板参数,并让ModelAdapter扩展BaseAdapter ,然后编译器首先尝试创buildModelAdapter.ModelViewHolder ,但ModelAdapter.ModelViewHolder (types为Class )的尚未创build。 它必须等待ModelAdapter被创build,因为ModelAdapterModelAdapter的范围内。

解决这个问题的方法是把ModelViewHolder类放到一个新的* .java文件中。

在扩展一个Base类的时候,发生了同样的情况。 但是这一次我是这样的(按照问题中给出的例子)

BaseAdapter.java

 public abstract class BaseAdapter<T, V extends BaseAdapter.ViewHolder> extends ArrayAdapter<T> { public BaseAdapter(Context context, int resource, Collection<T> collection) { // typical constructor logic } // some other custom defined methods public static class ViewHolder { // custom defined logic } } 

ModelAdapter.java

 import com.mypackage.ModelAdapter.ModelViewHolder; ***//NOTE THIS IMPORT!!!*** public class ModelAdapter extends BaseAdapter<Model, ModelAdapter.ModelViewHolder> { public ModelAdapter(Context context, int resource, Collection<Model> collection) { super(context, resource, collection); // typical constructor logic } public static class ModelViewHolder extends ViewHolder { // custom defined logic } } 

这样的警告已经消失,并没有需要将ModelViewHolder分成另一个'.java'文件。 请注意,它们位于两个不同的文件中,并在ModelAdapter.java中导入

我想费梁的回答是部分不正确的,因为ModelViewHolder静态应该可以初始化ModelViewHolder而不初始化其父类ModelAdapter

我之前面对过这个问题,我不知道为什么会这样,

但我解决了

使the not-accessible innerstand-alone类(不是在一个单独的文件意味着内部)

这是如何解决我的。 通常不应该有循环依赖问题,因为嵌套的视图持有者类是静态的。 例如,看看臭名昭着的LayoutParams层次结构,它的构build方式完全相同:一个类inheritance另一个类,然后它们的静态嵌套类具有相应的inheritance关系。
看起来圆形来自可见性范围问题。 ViewHolder只能在外部ModelAdapterinheritanceBaseAdapter的可见性范围之后才能扩展ViewHolder 。 同时, ModelAdapter不能inheritanceBaseAdapter直到BaseAdapter类初始化为generics参数所需的类。 另一方面, ModelViewHolder是一个静态嵌套类,在技术上并不依赖于它的外部类。

因此,解决scheme是在声明ViewHolder时完全限定ViewHolder的名称。 请注意下面代码段中的extends BaseAdapter.ViewHolder部分。 这样, ModelAdapter就不需要使用ModelAdapter的范围来了解ViewHolder

ModelAdapter.java

 public class ModelAdapter extends BaseAdapter<Model, ModelAdapter.ModelViewHolder> { public ModelAdapter(Context context, int resource, Collection<Model> collection) { super(context, resource, collection); // typical constructor logic } public static class ModelViewHolder extends BaseAdapter.ViewHolder { // custom defined logic } } 

关于Android Studio的一个注意事项:即使这个问题本身与Android Studio没有关系,但是我使用AS的“Copy class”function(使用AS 3.0)来运行它。 在复制时,它会为我“简化”代码,删除完全限定的名称。 所以,小心AS的聪明!