来自 Intent 包的 Kotlin getParcelableArray 无法将其转换为自定义类型

Nit*_*sta 5 android bundle classcastexception android-intent kotlin

我遇到了一个奇怪的问题。我有一个在 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)
Run Code Online (Sandbox Code Playgroud)

但是,在另一个活动中接收它时,我无法将它分配给类型为 Array 的变量,它要求我在 A 为 Parcelable 类型时将其分配给 Array 为什么我无法将变量分配给它。

in second Activity 
var arrayOfA:Array<A>?=null


arrayA=intent.get("array") as Array<A> // Problem here. Class cast exception
Run Code Online (Sandbox Code Playgroud)

我不明白为什么。有人可以在这里帮助我。我不想将变量的类型更改为数组,因为它有很多相互依赖。(这里的类只是一个演示)

========================================

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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*nec 8

Bundle.getParcelableArray(和Intent.getParcelableArrayExtra)返回Parcelable[]。你不能投射Parcelable[]MyClass[]. 您可以强制转换as的元素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)
Run Code Online (Sandbox Code Playgroud)


Jor*_*n H 6

我遇到了同样的问题。这就是我能够解决它的方法:

arrayOfA = intent.getParcelableArrayExtra("array").map { it as A }.toTypedArray()

由于某种原因,这不起作用:

arrayOfA = intent.getParcelableArrayExtra("array") as Array<A>

不幸的是,这显示了警告

未经检查的强制转换:Array<(out) Parcelable!>!到数组)

和运行时异常

java.lang.ClassCastException: android.os.Parcelable[] 不能转换为 com.company.app.A[]


raj*_* ks 2

您需要使用getParcelableArrayExtra来检索Parcelable对象,如下所示

arrayA = intent.getParcelableArrayExtra("array") as Array<A?>
Run Code Online (Sandbox Code Playgroud)

class A全部结束Nullable,因为你无法在 Kotlin 中强制Nullable转换Non Nullable

创建者应该像下面这样

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)
        }
    }
Run Code Online (Sandbox Code Playgroud)