java - intent - No es accesible en el contexto actual
generics java (2)
Creación Dead Lock
Utiliza ModelAdapter.ModelViewHolder
como el parámetro de plantilla de BaseAdapter
, y deja que ModelAdapter
amplíe BaseAdapter
, luego el compilador intentó crear ModelViewHolder
primero, pero la clase de ModelAdapter.ModelViewHolder
(el tipo es Class ) aún no se ha creado. Debe esperar a que se cree el ModelViewHolder
, porque ModelViewHolder
está dentro del alcance de ModelAdapter
.
La forma de resolverlo es poner la clase ModelViewHolder
en un nuevo archivo * .java.
Tengo el siguiente código
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 y ModelAdapter están en archivos separados. El problema es que tengo un error de compilación cuando trato de definir el ModelAdapter: ModelViewHolder no es accesible en el contexto actual
Realmente no entiendo este error y no puedo entender lo que estoy haciendo mal. ¿Puede alguien explicarme este problema o un enlace que pueda aclarar esta situación?
Me pasó lo mismo cuando extendí una clase Base. Pero esta vez lo tuve así (siguiendo el ejemplo dado en la pregunta)
BaseAdapter.java
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
}
}
ModelAdapter.java
import com.mypackage.ModelAdapter.ModelViewHolder; ***//NOTE THIS IMPORT!!!***
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
}
}
De esa forma, la advertencia desapareció y no es necesario separar ModelViewHolder en otro archivo ''.java''. Tenga en cuenta que están en dos archivos diferentes y la importación en ModelAdapter.java.
Creo que la respuesta de Fei Liang es parcialmente incorrecta porque ser ModelViewHolder estático debería permitir inicializar ModelViewHolder sin inicializar su clase padre ModelAdapter