在当前情况下无法访问

我有以下代码

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

BaseAdapter和ModelAdapter位于单独的文件中。 问题是我在尝试定义ModelAdapter时遇到编译错误: 在当前上下文中无法访问 ModelViewHolder

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

    创造死锁

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

    解决它的方法是将ModelViewHolder类放入一个新的* .java文件中。

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

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

    ModelAdapter.java

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

    关于Android Studio的注意事项:尽管问题本身与Android Studio无关,但我使用AS的“复制类”function(使用AS 3.0)遇到了它。 在复制时,它为我“简化”了代码,删除了完全限定的名称。 所以,要注意AS的聪明才智!

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

    BaseAdapter.java

     public abstract class BaseAdapter extends ArrayAdapter { public BaseAdapter(Context context, int resource, Collection 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 { public ModelAdapter(Context context, int resource, Collection collection) { super(context, resource, collection); // typical constructor logic } public static class ModelViewHolder extends ViewHolder { // custom defined logic } } 

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

    我认为Fei Liang的答案部分不正确,因为ModelViewHolder static应该可以在不初始化其父类ModelAdapter的情况下初始化ModelViewHolder

    我以前遇到过这个问题,我不确定为什么会这样,

    但我解决了

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