在当前上下文中不可访问

2022-09-01 17:00:12

我有以下代码

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在当前上下文中无法访问

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


答案 1

创建死锁

您使用 作为 的模板参数,并让扩展 ,然后编译器首先尝试创建,但尚未创建 类(类型为 Class)。它必须等待创建,因为它在 的作用域内。ModelAdapter.ModelViewHolderBaseAdapterModelAdapterBaseAdapterModelViewHolderModelAdapter.ModelViewHolderModelAdapterModelViewHolderModelAdapter

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


答案 2

以下是我如何为我解决的。通常不应该有循环依赖关系问题,因为嵌套的视图保持者类是静态的。例如,看看臭名昭著的层次结构,它的构建方式完全相同:一个类继承另一个类,然后它们的静态嵌套类具有相应的继承关系。
看起来循环性来自可见性范围问题。 只有在外部继承了 可见性范围之后,它才能扩展。同时,在类初始化之前不能继承,因为它需要泛型参数。另一方面,是一个静态嵌套类,在技术上不依赖于其外部类。

因此,解决方案是在声明 时完全限定 的名称。请注意以下代码段中的部分。这样,就不需要使用 的作用域来了解 .LayoutParamsModelViewHolderViewHolderModelAdapterBaseAdapterModelAdapterBaseAdapterModelViewHolderModelViewHolderViewHolderModelViewHolderextends BaseAdapter.ViewHolderModelViewHolderModelAdapterViewHolder

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的“复制类”功能(使用AS 3.0)遇到了它。在复制时,它为我“简化”了代码,删除了完全限定的名称。所以,要注意AS的聪明才智!