Esta es una pregunta general de JAVA. En androide, existe una interfaz Parcelable
:Clase genérica con problema de acceso de restricción
Este es un ejemplo en el interior del official documentation:
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
Estamos obligados a poner en práctica las 2 funciones describeContents()
y writeToParcel
.
(problema) Además de ellos, también se requieren para implementar la interfaz Parcelable.Creator<T>
como un campo estático llamado CREADOR.
Todo es realmente sencillo. Ahora quiero crear una clase genérica que tiene un tipo de clase parcelable:
public class ShushContainer<T extends Parcelable> implements Parcelable
soy capaz de poner en práctica parcelable. Puedo llamar a la T
's writeToParcel
función. Sin embargo, no puedo acceder al campo CREATOR estático.
public class ShushContainer<T extends Parcelable> implements Parcelable {
Vector<T> items;
String someField;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(someField);
dest.writeInt(items.size());
for(int i=0;i<items.size();i++)
items.get(i).writeToParcel(dest, flags);
}
public ShushContainer(Parcel in) {
someField = in.readString();
int size = in.readInt();
for(int i=0;i<size;i++)
//this does not work
items.add(T.CREATOR.createFromParcel(in));
}
public static final Parcelable.Creator<ShushContainer> CREATOR = new Parcelable.Creator<ShushContainer>() {
public ShushContainer createFromParcel(Parcel in) {
return new ShushContainer(in);
}
public ShushContainer[] newArray(int size) {
return new ShushContainer[size];
}
};
}
T es otra clase que implementa parcelable. –
Entonces, ¿cómo puede esa clase tener 'CREATOR' porque está definida en ShushContainer. Esta variable pertenece solo a esta clase. Simplemente úselo, ¿por qué necesita T.CREATOR? Simplemente use CREATOR –
Nopes ShushContainer implementa Parcelable y tiene su propio CREATOR. T también implementa Parcelable y tiene su propio CREADOR. Es este CREADOR al que no puedo acceder. –