2017-05-20 66 views
2

我是Kotlin的新手,只是嘗試一下。Kotlin - 繼承Java Class,實現Parcelable

我轉換到Kotlin的項目中的第一個類有一個擴展RectF(實現Parcelable)的內部類。

static class MyClass extends RectF

轉換爲

internal class MyClass : RectF()

但有以下錯誤:

This class implements Parcelable but does not provide a CREATOR field

做實驗,我發現val CREATOR = RectF.CREATOR MyClass中去除誤差,但是這是醜陋的黑客。

任何人都可以在這裏解釋/解決問題嗎?

非常感謝。

+0

它真的是錯誤還是警告?您應該從Java代碼中獲得相同的警告。很可能你應該從一開始就使用組合而不是繼承。 – Joni

+0

Java代碼中沒有警告。 – veritas1

回答

3

您必須遵守的Parcelable合同:

Classes implementing the Parcelable interface must also have a non-null static field called CREATOR of a type that implements the Parcelable.Creator interface.

但你的黑客只刪除皮棉錯誤。您應該直接爲您的班級實施Parcelable.Creator,而不是重新使用RectF之一。

internal class MyClass : RectF() { 
    companion object { 
     @JvmField 
     val CREATOR = Parcelable.Creator() { ... } 
    } 
} 
+0

感謝您的回答。這似乎很奇怪。 RectF類實現Parcelable接口,並履行該合同。 Java代碼沒有問題。 – veritas1

+0

你也可以看一下[PaperParcel](http://grandstaish.github.io/paperparcel/)爲你生成一切。 – tynn

+0

如果您使用父類CREATOR,那麼在反序列化後,您將最終得到父類的實例,而不是子類。你還需要爲子類編寫一個CREATOR。 – BladeCoder