Um das ganze Bild hier zu bekommen ist, was ich am Ende mit:
Der Anwendungsfall ist man hat eine Parcelable
generische Instanz es model
nennen lassen, die mit gemeinsamen Eigenschaften von Parcelable
Wrapper abgeschlossen sein soll um das Modell nicht mit extrinsischen Feldern zu belasten. Zum Beispiel Item
Wrapper.
Im Beispiel unter dem Wrapper zusätzliche Eigenschaft gibt uns irgendeine Art von index
:
class Item<T : Parcelable> (val model: T, val index: Int) : Parcelable {
constructor(parcel: Parcel) :
this(parcel.readParcelable(
Item<T>::model.javaClass.classLoader),
parcel.readInt()
) {}
override fun writeToParcel(parcel: Parcel?, flag: Int) {
parcel?.writeParcelable(model, 0)
parcel?.writeInt(index)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<Item<Parcelable>> {
override fun createFromParcel(parcel: Parcel): Item<Parcelable> {
return Item(parcel)
}
override fun newArray(size: Int): Array<Item<Parcelable>?> {
return arrayOfNulls(size)
}
}
}
Also am Ende wir so etwas wie haben: Item(Person("John"), 0)
, Item(Person("Bill"), 1)
...
class PersonPagerFragment() : BasePagerFragment<Person>() {
companion object {
fun newInstance(itemList: ArrayList<Item<Person>>)
: PersonPagerFragment {
val args = Bundle()
val fragment = PersonPagerFragment()
args.putParcelableArrayList("items", itemList)
fragment.arguments = args
return fragment
}
}
}
Verlängerung Klasse wie:
class BasePagerFragment<T : Parcelable> : Fragment(){
protected fun readBundle(bundle: Bundle?) {
bundle.getParcelableArrayList<Item<T>>("items")
}
}
Keine Ahnung, ob es rel Ated, aber warum wird Ihr T "out" erklärt, wenn Sie es für den Konstruktor übergeben? Bedeutet das nicht, dass es nicht kovariant ist und daher nicht "out" sein sollte? Was passiert, wenn Sie "out" entfernen? –
@PaulHicks wahr, aber es betrifft nicht das Problem –
Yep dachte nicht so. Denken Sie daran, T ist keine Klasse, es ist ein formaler Parameter. Sie können eine [reified Inline-Funktion] (https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters) für diese Art von Sache verwenden, aber das wird in einem sekundären Konstruktor nicht funktionieren . Sie müssten eine normale verdinglichte Inline-Funktion in einer Factory oder wahrscheinlicher auf einem Companion-Objekt verwenden. –