Android 来自intent bundle的Kotlin getParcelableArray无法将其强制转换为自定义类型
我遇到了一个奇怪的问题。我有一个在kotlin中实现Parcelable接口的类a 我将类A的数组从一个活动传递到另一个活动,这里没有问题Android 来自intent bundle的Kotlin getParcelableArray无法将其强制转换为自定义类型,android,android-intent,kotlin,bundle,classcastexception,Android,Android Intent,Kotlin,Bundle,Classcastexception,我遇到了一个奇怪的问题。我有一个在kotlin中实现Parcelable接口的类a 我将类A的数组从一个活动传递到另一个活动,这里没有问题 var arrayOfA:Array<A> // just to tell the type assume the array is initialised with the value intent.putExtra("array", arrayOfA) var arrayOfA:Array//只是告诉类型假定数组是用值初始化的 inte
var arrayOfA:Array<A> // just to tell the type assume the array is initialised with the value
intent.putExtra("array", arrayOfA)
var arrayOfA:Array//只是告诉类型假定数组是用值初始化的
intent.putExtra(“数组”,arrayOfA)
但是,当在另一个活动中接收到它时,我无法将其分配给类型为Array的变量。当类型为parcelable时,它要求我将其分配给Array。为什么我无法将变量分配给它
in second Activity
var arrayOfA:Array<A>?=null
arrayA=intent.get("array") as Array<A> // Problem here. Class cast exception
第二个活动中的
var arrayOfA:数组?=null
arrayA=intent.get(“数组”)作为数组//这里有个问题。类强制转换异常
我不明白为什么。有人能帮我吗。我不想将变量的类型更改为数组,因为它有很多相互依赖关系。(这里的类只是一个演示)
========================================
class A(val a:String?,val b:String?):Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readString()) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(a)
parcel.writeString(b)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<A> {
override fun createFromParcel(parcel: Parcel): A {
return A(parcel)
}
override fun newArray(size: Int): Array<A?> {
return arrayOfNulls(size)
}
}
}
A类(val A:字符串?、val b:字符串?):可包裹{
构造函数(地块:地块):此(
parcel.readString(),
parcel.readString()){
}
覆盖地块(地块:地块,标志:Int){
包裹。书面记录(a)
包裹书面记录(b)
}
覆盖有趣的描述内容():Int{
返回0
}
同伴对象创建者:Parcelable.CREATOR{
覆盖createFromParcel(地块:地块):A{
归还(包裹)
}
覆盖新数组(大小:Int):数组{
返回阵列fnulls(大小)
}
}
}
您需要使用getParcelableArrayExtra
检索Parcelable
对象,如中所示
arrayA = intent.getParcelableArrayExtra("array") as Array<A?>
我遇到了同样的问题。我就是这样解决的:
arrayOfA=intent.getParcelableArrayExtra(“数组”).map{it as A}.toTypedArray()
由于某些原因,这不起作用:
arrayOfA=intent.getParcelableArrayExtra(“数组”)作为数组
不幸的是,这显示了一个警告
未选中的演员:阵列!到阵列)
和运行时异常
java.lang.ClassCastException:无法强制转换android.os.Parcelable[]
至com.company.app.A[]
Bundle.getParcelableArray
(和Intent.getParcelableArrayExtra
)返回Parcelable[]
。您不能将Parcelable[]
强制转换为MyClass[]
。您可以将Parcelable[]
的元素强制转换为MyClass
改用Bundle.getParcelableArrayList
(或其Intent
对应项),因为它具有泛型类型
var values: List<MyClass> = listOf(...)
intent.putParcelableArrayListExtra("key", values.asArrayList())
values = intent.getParcelableArrayListExtra("key")!!
fun <E> List<E>.asArrayList(): ArrayList<E> = this as? ArrayList<E> ?: ArrayList(this)
var值:List=listOf(…)
intent.putParcelableArrayListExtra(“key”,values.asArrayList())
values=intent.getParcelableArrayListExtra(“键”)!!
乐趣列表.asArrayList():ArrayList=这是什么?ArrayList?:ArrayList(此)
您确实需要在问题中添加A类。没有它很难回答请看编辑即使我这么做了,我也会得到classcastexpection。无法将Parcelable[]转换为[]您可以粘贴堆栈跟踪吗?java.lang.ClassCastException:android.os.Parcelable[]无法转换为[]让我尝试一下并告诉您
var values: List<MyClass> = listOf(...)
intent.putParcelableArrayListExtra("key", values.asArrayList())
values = intent.getParcelableArrayListExtra("key")!!
fun <E> List<E>.asArrayList(): ArrayList<E> = this as? ArrayList<E> ?: ArrayList(this)