获取泛型类加载器来分析嵌套的Parcelable泛型字段 [英] Get generics class loader for parsing nested Parcelable generic field
问题描述
我有一个 Parcelable
泛型类型的封装器,但是 Parcel
构造器无法编译,因为 T c> class MyItem< T:Parcelable> class MyItem< T:Parcelable> (val model:T):Parcelable {
constructor(parcel:Parcel):
this(parcel.readParcelable(T :: class.java.classLoader)){
}
}
有没有解决这个问题的方法?
使用案例有一个 Parcelable
泛型实例,我们称它为 model
,它应该使用 Parcelable
封装器,以免污染具有外部字段的模型。例如 Item
wrapper。
在下面的例子中,wrapper extra属性为我们提供了一些类型的 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()
){}
覆盖fun writeToParcel(parcel:Parcel ?, flag:Int){
parcel? .writeParcelable(model,0)
parcel?.writeInt(index)
}
覆盖fun describeContents():Int {
return 0
}
伴随对象CREATOR:Parcelable.Creator< Item< Parcelable>> {
覆盖fun createFromParcel(parcel:Parcel):Item< Parcelable> {
return Item(parcel)
}
覆盖fun newArray(size:Int):Array< Item< Parcelable>?> {
return arrayOfNulls(size)
}
}
}
$ b $因此,最终我们可以得到类似于: Item(Person(John),0)
, Item(Person( ()):1)
...
class PersonPagerFragment():BasePagerFragment< Person>( ){
companion object {
fun newInstance(itemList:ArrayList< Item< Person>>)
:PersonPagerFragment {
val args = Bundle()
val片段= PersonPagerFragment()
args.putParcelableArrayList(items,itemList)
fragment.arguments = args
返回片段
}
}
}
扩展类:
class BasePagerFragment< T:Parcelable> :Fragment(){
protected fun readBundle(bundle:Bundle?){
bundle.getParcelableArrayList< Item< T>(items)
}
}
I have a wrapper of Parcelable
generic type but Parcel
constructing fails to compile because T
class can not be determined generically
class MyItem<T : Parcelable> (val model: T) : Parcelable {
constructor(parcel: Parcel) :
this(parcel.readParcelable(T::class.java.classLoader)) {
}
}
Is there any solution to this case?
In order to get the whole picture here is what I ended up with:
The use case is one has a Parcelable
generic instance let's call it model
which should be completed with common properties of Parcelable
wrapper in order to not pollute the model with extrinsic fields. For example Item
wrapper.
In the example below the wrapper extra property gives us some type of 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)
}
}
}
So in the end we can have something like: 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
}
}
}
extending class like:
class BasePagerFragment<T : Parcelable> : Fragment(){
protected fun readBundle(bundle: Bundle?) {
bundle.getParcelableArrayList<Item<T>>("items")
}
}
这篇关于获取泛型类加载器来分析嵌套的Parcelable泛型字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!