Android:错误:不能从静态上下文中引用非静态类型变量 T

问题描述

我有以下课程:

@Parcelize
data class Collection<T : Parcelable> constructor(
    var models: List<T>,var cursor: String?
) : Parcelable

当我使用 Kotlin 1.4.10 时,项目构建正确且没有任何错误,然后我将项目更新为 Kotlin 1.4.21,并迁移到使用 kotlin-parcelize 而不是 kotlin-android-extensions,因此在 Kotlin 更新后,在构建项目时出现以下错误

> Task :domain:kaptDebugKotlin Failed
/Library/DevelopmentArea/workspace/baaz_android_new/clean_domain/domain/build/tmp/kapt3/stubs/debug/com/myapp/domain/model/Collection.java:101: error: non-static type variable T cannot be referenced from a static context
        public final com.myapp.domain.model.Collection<T>[] newArray(int size) {
                                                                   ^/Library/DevelopmentArea/workspace/baaz_android_new/clean_domain/domain/build/tmp/kapt3/stubs/debug/com/myapp/domain/model/Collection.java:110: error: non-static type variable T cannot be referenced from a static context
        public final com.myapp.domain.model.Collection<T> createFromParcel(@org.jetbrains.annotations.NotNull()

注意:我使用的是 Android Studio 4.1.1

解决方法

目前为了修复我得到的错误,同时继续使用 Kotlin 1.4.21,我刚刚从任何具有泛型类型用法的类中删除了 @Parcelize 注释,就像问题中的那个一样,并且刚刚实现Parcelable 的旧方式如下所示:

    data class Collection<T> constructor(
    var models: List<T>,var cursor: String?
) : Parcelable {

    constructor(parcel: Parcel) : this(
        mutableListOf<T>().also { list: List<T> ->
            parcel.readList(list,Collection<T>::models.javaClass.classLoader)
        },parcel.readString())

    override fun writeToParcel(parcel: Parcel,flags: Int) {
        parcel.writeList(models)
        parcel.writeString(cursor)
    }

    override fun describeContents(): Int = 0

    companion object {

        @JvmField
        val CREATOR = object : Parcelable.Creator<Collection<Parcelable>> {
            override fun createFromParcel(source: Parcel): Collection<Parcelable> {
                return Collection(source)
            }

            override fun newArray(size: Int): Array<Collection<Parcelable>?> {
                return arrayOfNulls(size)
            }
        }
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...