Java 在当前上下文中不可访问

Java 在当前上下文中不可访问,java,android,generics,scope,android-context,Java,Android,Generics,Scope,Android Context,我有以下代码 public abstract class BaseAdapter<T, V extends BaseAdapter.ViewHolder> extends ArrayAdapter<T> { public BaseAdapter(Context context, int resource, Collection<T> collection) { // typical constructor logic }

我有以下代码

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扩展了ArrayAdapter{
公共BaseAdapter(上下文上下文、int资源、集合){
//典型构造函数逻辑
}
//其他一些自定义定义的方法
公共静态类视图持有者{
//自定义逻辑
}
}
公共类ModelAdapter扩展了BaseAdapter{
公共模型适配器(上下文、int资源、集合){
超级(上下文、资源、集合);
//典型构造函数逻辑
}
公共静态类ModelViewHolder扩展了ViewHolder{
//自定义逻辑
}
}
BaseAdapter和ModelAdapter位于分开的文件中。问题是,我在尝试定义ModelAdapter时出现编译错误: 当前上下文中无法访问ModelViewHolder


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

创建死锁

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


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

扩展基类时,我也遇到了同样的情况。但这次我是这样做的(按照问题中给出的例子)

BaseAdapter.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
    }
}
公共抽象类BaseAdapter扩展了ArrayAdapter{
公共BaseAdapter(上下文上下文、int资源、集合){
//典型构造函数逻辑
}
//其他一些自定义定义的方法
公共静态类视图持有者{
//自定义逻辑
}
}
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
    }
}
导入com.mypackage.ModelAdapter.ModelViewHolder***//注意这个导入***
公共类ModelAdapter扩展了BaseAdapter{
公共模型适配器(上下文、int资源、集合){
超级(上下文、资源、集合);
//典型构造函数逻辑
}
公共静态类ModelViewHolder扩展了ViewHolder{
//自定义逻辑
}
}
这样警告就消失了,不需要将ModelViewHolder分离到另一个“.java”文件中。请注意,它们位于两个不同的文件中,ModelAdapter.java中的导入文件为import


我认为Fei Liang的回答部分是错误的,因为作为ModelViewHolder静态应该可以在不初始化其父类ModelAdapter的情况下初始化ModelViewHolder

我以前遇到过这个问题,我不确定为什么会发生这种情况,但我通过将不可访问的内部类设置为独立类来解决它(非单独文件中的内部方式).

我就是这样解决的。通常不应该存在循环依赖性问题,因为嵌套的viewholder类是静态的。例如,看看臭名昭著的
LayoutParams
层次结构,它的构建方式完全相同:一个类继承另一个类,然后它们的静态嵌套类具有相应的继承r关系。
循环性似乎来自可见性范围问题。
ModelViewHolder
只有在外部
modeldadapter
继承
BaseAdapter
的可见性范围后才可以扩展
ViewHolder
。同时
modeldadapter
无法继承
BaseAdapter
e> ModelViewHolder类根据泛型参数的需要进行初始化。另一方面,
ModelViewHolder
是一个静态嵌套类,技术上不依赖于其外部类。

因此,解决方案是在声明
ModelViewHolder
时完全限定
ViewHolder
的名称。请注意
扩展了BaseAdapter。下面代码段中的ViewHolder
部分。这样,
ModelViewHolder
就不需要使用
modeldatapter
的作用域来了解
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
    }
}
公共类ModelAdapter扩展了BaseAdapter{
公共模型适配器(上下文、int资源、集合){
超级(上下文、资源、集合);
//典型构造函数逻辑
}
公共静态类ModelViewHolder扩展了BaseAdapter.ViewHolder{
//自定义逻辑
}
}

关于Android Studio的一个注意事项:尽管这个问题本身与Android Studio无关,但我使用AS的“复制类”功能(使用AS 3.0)遇到了它。在复制时,它“简化了”为我编写的代码,删除完全限定名。因此,请注意AS的智能性!

你能发布完整的编译器消息吗?这是完整的编译器消息好答案!我完全被这条消息所困扰。我有同样的任务。也许,将ViewHolder类移动到单独的*.java文件会更方便。我仍然不明白他的…不应该使ModelViewHolder静态解决此问题?静态修饰符应该使该类可以在不初始化父类的情况下初始化…我使用的是Android Studio 1.5.2,这对我不起作用。Android Studio说导入未使用,但仍然给出错误。