2016-01-10 118 views
10

我有这样的Java parcelable:的Android Parcelable在科特林

@SuppressWarnings("rawtypes") 
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    public KwerendaGraficzna createFromParcel(Parcel in) { 
     return new KwerendaGraficzna(in); 
    } 

    public KwerendaGraficzna[] newArray(int size) { 
     return new KwerendaGraficzna[size]; 
    } 
}; 

现在努力实现它在科特林:

companion object { 
    @SuppressWarnings("rawtypes") 
    val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> { 
     override fun createFromParcel(`in`: Parcel): KwerendaGraficzna { 
      return KwerendaGraficzna(`in`) 
     } 

     override fun newArray(size: Int): Array<KwerendaGraficzna!> { 
      return arrayOfNulls<KwerendaGraficzna!>(size) 
     } 
    } 
} 

arrayOfNulls不会编译需要KwerendaGraficzna而它声称它收到KwerendaGraficzna?

那我该怎么做呢?

+0

另请参阅https://stackoverflow.com/questions/33551972/is-there-a-convenient-way-to-create-parcelable-data-classes-in-android-with-kotl –

回答

15

我怀疑你使用的是Kotlin编译器的过时版本(因为你使用的是!)。这里有一个版本,最新的版本正确编译:

companion object { 
    @JvmField 
    val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> { 
     override fun createFromParcel(`in`: Parcel): KwerendaGraficzna { 
      return KwerendaGraficzna(`in`) 
     } 

     override fun newArray(size: Int): Array<KwerendaGraficzna?> { 
      return arrayOfNulls(size) 
     } 
    } 
} 

由于Parcelable.Creator要求,我们需要将CREATOR财产与@JvmFieldJvmStatic标志着一个公共静态字段。

+0

Thanx,我会检查它后来。有一个问题 - 为什么Kotlin需要Java中没有的类型规范? – ssuukk

+0

@ssuukk不确定你的意思。 Kotlin使用[声明网站差异](https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance)而不是使用网站差异。 – miensol

+0

@miensol你认为这仍然有效吗?我最终遇到了一个异常:当试图从一个bundle读取数据时,Parcelable协议需要一个名为CREATOR的Parcelable.Creator对象。 – Eggman87