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说导入未使用,但仍然给出错误。