2017-01-30 1 views
0

in meiner Anwendung ich Klasse haben, die eine Liste der Liste enthält, auf die ich Parcelable zu bestimmten Klasse machen wollen, so weit habe ich versucht,Parcel - wählen kann nicht von parametrisierten Typ

public class FeaturesParcelable implements Parcelable { 
    private List<List<SpinnerModel>> featuresSublist; 

    public List<List<SpinnerModel>> getFeaturesSublist() { 
     return featuresSublist; 
    } 

    public void setFeaturesSublist(List<List<SpinnerModel>> featuresSublist) { 
     this.featuresSublist = featuresSublist; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeList(this.featuresSublist); 
    } 

    public FeaturesParcelable() { 
    } 

    protected FeaturesParcelable(Parcel in) { 
     this.featuresSublist = new ArrayList<List<SpinnerModel>>(); 
     in.readList(this.featuresSublist, List<SpinnerModel>.class.getClassLoader()); 
    } 

    public static final Parcelable.Creator<FeaturesParcelable> CREATOR = new Parcelable.Creator<FeaturesParcelable>() { 
     @Override 
     public FeaturesParcelable createFromParcel(Parcel source) { 
      return new FeaturesParcelable(source); 
     } 

     @Override 
     public FeaturesParcelable[] newArray(int size) { 
      return new FeaturesParcelable[size]; 
     } 
    }; 
} 

aber ich erhalte eine Fehlermeldung kann nicht innerhalb

von parametrisierte Typ wählen Sie das, was Sie erwarten
protected FeaturesParcelable(Parcel in) { 
     this.featuresSublist = new ArrayList<List<SpinnerModel>>(); 
     in.readList(this.featuresSublist, List<SpinnerModel>.class.getClassLoader()); 
    } 
+1

Aufgrund der Funktionsweise von Interfaces/Generics in Java benötigen Sie wahrscheinlich zunächst eine konkrete List-Implementierung, anstatt wie zuvor die List -Schnittstelle zu verwenden. – Submersed

Antwort

1

1) List<SpinnerModel>.class tut nicht lösen. Java verwendet generic type erasure, daher ist der Laufzeittyp dieser Anweisung Class<List<?>>. Dies reicht nicht aus, um eine geeignete Implementierung von List oder den Typ des Listenelements zu identifizieren.

2) Auch wenn Sie Ihre erste Schwierigkeit zu überwinden (zum Beispiel durch List mit ArrayList ersetzen und verschachtelten Listen manuell Deserialisieren), sollten Sie sich bewusst sein, dass List<SpinnerModel>.class.getClassLoader() einen System kehren Classloader. System ClassLoader ist hardcodiert, um nur Android-Framework-Klassen zu laden. Um Klassen zu deserialisieren, die in Ihrer Anwendung deklariert wurden, verwenden Sie den zugewiesenen ClassLoader: SpinnerModel.class.getClassLoader().

Verwandte Themen