2014-02-26 82 views
5

我有一个带泛型类型对象的parcelable类。通常我会读出这样的对象:如何从类型变量中获取ClassLoader(用于使用泛型来分类)

in.readParcelable(MyParcelableClass.class.getClassLoader()) 

显然我不能这样做与泛型类型变量..看到下面的代码。任何人都可以将我指向正确的方向吗?

public class ParcelableOverlayItem<T extends Parcelable> extends OverlayItem implements Parcelable { 

    private T parcelableTypeObject; 

    protected ParcelableOverlayItem(Parcel in) { 
    this(in.readParcelable(T.class.getClassLoader())); // this is not working: "Cannot select from a type variable" 
    } 

    public void writeToParcel(Parcel dest, int flags) { 
    dest.writeParcelable(parcelableTypeObject, flags); 
    } 

    public ParcelableOverlayItem(T parcelableTypeObject) { 
    super(); 
    this.parcelableTypeObject = parcelableTypeObject; 
    } 

    public T getParcelableTypeObject() { 
    return parcelableTypeObject; 
    } 

    // ... 
} 
+2

应该ParcelableOverlayItem

+0

我其实已经纠正了,我还是谢谢你感激不尽! – Blacklight

+0

解决方法是在'ParcelableOverlayItem'的构造函数中接收'T'的类型,并在'T'之前将它存储在Parcel中。然后在阅读时你可以做'this(in.readParcelable(typeOfT.class.getClassLoader()));'。 [检查源代码在这里](https://stackoverflow.com/a/28069422/3715151)。 – Daniel

回答

0

您可以从通用型T得到ClassLoader这样

this(in.readParcelable(parcelableTypeObject.getClass().getClassLoader())); 
+0

不幸的是,IDEA告诉我'不能在超类型构造函数被调用之前引用'ParcelableOverlayItem.parcelableTypeObject'' – Blacklight

+0

@Blacklight是你的'OverlayItem'类有参数化构造函数吗?如果是的话,你需要调用像超级(参数)''的ParcelableOverlayItem中的超级类Constrcutor ... –

+0

是的,它使用参数,我只是简化了我的例子,它不会有所作为。这是超级课程:http://goo.gl/lBJwi9 – Blacklight