首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >来自intent捆绑包的Kotlin getParcelableArray无法将其转换为自定义类型

来自intent捆绑包的Kotlin getParcelableArray无法将其转换为自定义类型
EN

Stack Overflow用户
提问于 2017-09-12 13:54:52
回答 3查看 4.5K关注 0票数 6

我遇到了一个奇怪的问题。我有一个用kotlin实现Parcelable接口的A类。

我将A类的数组从一个活动传递到另一个活动,这里没有问题。

代码语言:javascript
复制
 var arrayOfA:Array<A> // just to tell the type assume the array is initialised with the value
 intent.putExtra("array", arrayOfA)

但是当我在另一个活动中接收它时,我不能将它赋值给类型为Array的变量,它要求我在A为parcelable类型时将它赋值给Array,这就是为什么我不能给它赋值的原因。

代码语言:javascript
复制
in second Activity 
var arrayOfA:Array<A>?=null


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

我不能理解为什么。有人能帮我一下吗。我不想将变量类型更改为Array,因为它有很多内部依赖项(这里的类只是一个演示)。

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

代码语言:javascript
复制
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)
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2019-05-30 05:27:28

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

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

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

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

不幸的是,这显示出一个警告

未检查强制转换: Array<(out)可打包!>!到数组)

和运行时异常

java.lang.ClassCastException:无法将android.os.Parcelable[]强制转换为com.company.app.A[]

票数 7
EN

Stack Overflow用户

发布于 2019-05-30 05:45:51

Bundle.getParcelableArray (和Intent.getParcelableArrayExtra)返回Parcelable[]。您不能将Parcelable[]转换为MyClass[]。您可以将Parcelable[]的元素强制转换为MyClass

请改用Bundle.getParcelableArrayList (或其对应的Intent ),因为它具有泛型类型。

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2017-09-12 14:01:26

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

代码语言:javascript
复制
arrayA = intent.getParcelableArrayExtra("array") as Array<A?>

class A转换为Nullable,因为在kotlin语言中不能将Nullable转换为Non Nullable

创建者应如下所示

代码语言:javascript
复制
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)
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46168887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档