2017-05-20 7 views
2

Ich bin neu in Kotlin, nur ausprobieren.Kotlin - Inherit von Java Klasse, die Parcelable implementiert

Die erste Klasse von meinem Projekt, das ich nach Kotlin konvertiert habe, hat eine innere Klasse, die RectF erweitert (was Parcelable implementiert).

static class MyClass extends RectF

zu

umgewandelt

internal class MyClass : RectF()

Aber hat den folgenden Fehler:

This class implements Parcelable but does not provide a CREATOR field

Experimenting, fand ich val CREATOR = RectF.CREATOR in MyClass den Fehler beseitigt, aber das ist hässlich Hack.

Kann jemand das Problem hier erklären/lösen?

Vielen Dank.

+0

Ist es wirklich ein Fehler oder eine Warnung? Sie sollten die gleiche Warnung von Ihrem Java-Code erhalten. Höchstwahrscheinlich sollten Sie von Anfang an Komposition und nicht Vererbung verwendet haben. – Joni

+0

Keine Warnung in Java-Code. – veritas1

Antwort

3

Sie müssen den Parcelable Vertrag erfüllen:

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

Aber Ihr Hack entfernt nur die Flusen Fehler. Sie sollten die Parcelable.Creator für Ihre Klasse direkt implementieren, nicht die von RectF.

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

Danke für die Antwort. Dies scheint jedoch seltsam. Die RectF-Klasse implementiert die Parcelable-Schnittstelle und erfüllt diesen Vertrag. Kein Problem in Java-Code. – veritas1

+0

Sie können sich auch [PaperParcel] (http://grandstaish.github.io/paperparcel/) ansehen, um alles für Sie zu erstellen. – tynn

+0

Wenn Sie die Elternklasse CREATOR verwenden, erhalten Sie nach der Deserialisierung eine Instanz der Elternklasse, nicht die Kindklasse. Sie müssen einen CREATOR für die Kindklasse schreiben. – BladeCoder

Verwandte Themen