Android - "No enclosing instance of type 'some.abstract.class.name' class is in scope" 扩展时出错
Android - "No enclosing instance of type 'some.abstract.class.name' class is in scope" error when extended
我有一个来自外部库的抽象适配器 class:
public abstract class DragItemAdapter<T, VH extends DragItemAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {
//Their other codes
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(final View itemView, int handleResId) {
super(itemView);
//The rest of their codes
}
}
}
我的适配器扩展了那个适配器
public class ChecklistAdapter extends DragItemAdapter<Pair<Integer, SomeClass>, ViewHolderForChecklist> {
@Override
public ViewHolderForChecklist onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
grab = R.id.grab;
return new ViewHolderForChecklist(view,grab);
}
}
如果我的 ViewHolderForChecklist
是 ChecklistAdapter
的内部 class,它工作正常。但是如果我将 ViewHolderForChecklist
移动到一个全新的 class
public class ViewHolderForChecklist extends DragItemAdapter<Pair<Long, SomeClass>, ViewHolderForChecklist>.ViewHolder { // The error is at this line
public ViewHolderForChecklist(final View itemView, int grab) {
super(itemView, grab);
}
@Override
public void onItemClicked(View view) {
}
@Override
public boolean onItemLongClicked(View view) {
return true;
}
}
实时有误
No enclosing instance of type 'library.package.name.DragItemAdapter' class is in scope
和编译时的错误
error: an enclosing instance that contains DragItemAdapter.ViewHolder is required
使用 Refractor 中的 "move" 也有同样的问题。我对这种...'nested-class”还是陌生的,所以我不知道这有什么问题,或者我应该包含更多什么样的信息。
谢谢!
ViewHolder
是 DragItemAdapter
的 内部 class(因为未声明 [=13=])。这意味着 class ViewHolder
的每个对象都必须与 class DragItemAdapter
的对象关联(实际上,它必须是 class DragItemAdapter
).你可以认为 ViewHolder
有一个隐藏的实例变量,比如
DragItemAdapter __outerObject;
ViewHolder
可以直接访问属于__outerObject
的实例变量和方法。
这意味着当你说 new ViewHolder(...)
时,你必须有一些 DragItemAdapter
才能与 ViewHolder
相关联。
这同样适用于 ViewHolder
的任何子 class,包括 ViewHolderChecklist
,因为子class 继承了隐藏的 __outerObject
变量。
在第一个示例中,ViewHolderChecklist
在 ChecklistAdapter
中,onCreateViewHolder
方法将始终在 ChecklistAdapter
实例上调用。当该方法显示 new ViewHolderChecklist
时,新对象的 __outerObject
将被设置为 ChecklistAdapter
实例。此外,如果外部 class 有一个 ChecklistAdapter adapter;
,它可以通过说 adapter.new ViewHolderChecklist(...)
.
使用它来创建一个新的 ViewHolderChecklist
当您将 ViewHolderChecklist
移到 class 之外时,将无法创建新实例,因为无法以某种方式使用 new
告诉它 __outerObject
应该是什么。 adapter.new ViewHolderChecklist(...)
语法将不起作用,因为该语法只允许嵌套 classes,而 ViewHolderChecklist
不是嵌套 class。所以 ViewHolderChecklist
必须是 DragItemAdapter
.
的子 class 中的嵌套 class
更正:实际上可以这样声明ViewHolderChecklist
。然而,你必须给它一个明确的构造函数,它必须有一个合格的超级class构造函数调用(见this; see also .
我有一个来自外部库的抽象适配器 class:
public abstract class DragItemAdapter<T, VH extends DragItemAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {
//Their other codes
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(final View itemView, int handleResId) {
super(itemView);
//The rest of their codes
}
}
}
我的适配器扩展了那个适配器
public class ChecklistAdapter extends DragItemAdapter<Pair<Integer, SomeClass>, ViewHolderForChecklist> {
@Override
public ViewHolderForChecklist onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
grab = R.id.grab;
return new ViewHolderForChecklist(view,grab);
}
}
如果我的 ViewHolderForChecklist
是 ChecklistAdapter
的内部 class,它工作正常。但是如果我将 ViewHolderForChecklist
移动到一个全新的 class
public class ViewHolderForChecklist extends DragItemAdapter<Pair<Long, SomeClass>, ViewHolderForChecklist>.ViewHolder { // The error is at this line
public ViewHolderForChecklist(final View itemView, int grab) {
super(itemView, grab);
}
@Override
public void onItemClicked(View view) {
}
@Override
public boolean onItemLongClicked(View view) {
return true;
}
}
实时有误
No enclosing instance of type 'library.package.name.DragItemAdapter' class is in scope
和编译时的错误
error: an enclosing instance that contains DragItemAdapter.ViewHolder is required
使用 Refractor 中的 "move" 也有同样的问题。我对这种...'nested-class”还是陌生的,所以我不知道这有什么问题,或者我应该包含更多什么样的信息。
谢谢!
ViewHolder
是 DragItemAdapter
的 内部 class(因为未声明 [=13=])。这意味着 class ViewHolder
的每个对象都必须与 class DragItemAdapter
的对象关联(实际上,它必须是 class DragItemAdapter
).你可以认为 ViewHolder
有一个隐藏的实例变量,比如
DragItemAdapter __outerObject;
ViewHolder
可以直接访问属于__outerObject
的实例变量和方法。
这意味着当你说 new ViewHolder(...)
时,你必须有一些 DragItemAdapter
才能与 ViewHolder
相关联。
这同样适用于 ViewHolder
的任何子 class,包括 ViewHolderChecklist
,因为子class 继承了隐藏的 __outerObject
变量。
在第一个示例中,ViewHolderChecklist
在 ChecklistAdapter
中,onCreateViewHolder
方法将始终在 ChecklistAdapter
实例上调用。当该方法显示 new ViewHolderChecklist
时,新对象的 __outerObject
将被设置为 ChecklistAdapter
实例。此外,如果外部 class 有一个 ChecklistAdapter adapter;
,它可以通过说 adapter.new ViewHolderChecklist(...)
.
ViewHolderChecklist
当您将 ViewHolderChecklist
移到 class 之外时,将无法创建新实例,因为无法以某种方式使用 new
告诉它 __outerObject
应该是什么。 adapter.new ViewHolderChecklist(...)
语法将不起作用,因为该语法只允许嵌套 classes,而 ViewHolderChecklist
不是嵌套 class。所以 ViewHolderChecklist
必须是 DragItemAdapter
.
更正:实际上可以这样声明ViewHolderChecklist
。然而,你必须给它一个明确的构造函数,它必须有一个合格的超级class构造函数调用(见this; see also .