【问题标题】:Type mismatch error after converting java generic to kotlin将 java generic 转换为 kotlin 后出现类型不匹配错误
【发布时间】:2023-01-26 23:53:04
【问题描述】:

转换成kotlin后出现如下错误:

java代码。没有错误:

public class Test {

    public void getList() {
        List<Parent> list = join(
                Parent.Child1.values(),
                Parent.Child2.values()
        );
    }
    public interface Parent {
        enum Child1 implements Parent {}
        enum Child2 implements Parent {}
    }
    public <T> List<T> join(T[]... collections) {
        ArrayList<T> result = new ArrayList<>();
        for (T[] collection : collections) {
            result.addAll(Arrays.asList(collection));
        }
        return result;
    }
}

科特林代码。类型不匹配错误

class Test2 {
    val list: Unit
        get() {
            val list = join<Parent>(
                Parent.Child1.values(),
                Parent.Child2.values()
            )
        }

    interface Parent {
        enum class Child1 : Parent
        enum class Child2 : Parent
    }

    fun <T> join(vararg collections: Array<T>): List<T> {
        val result = ArrayList<T>()
        for (collection in collections) {
            result.addAll(collection.toList())
        }
        return result
    }
}

请帮助我,我该如何解决这个错误?

不知道如何解决

【问题讨论】:

    标签: java android kotlin generics


    【解决方案1】:

    我认为允许您这样做的 Java 数组类型实现设计中存在错误。它保留了将 T(在本例中为父级)放入只能接受 T 的某些子类型的数组的可能性,这将在运行时抛出异常。

    Kotlin 对泛型更加严格,防止可能因您可能做出的任何意外假设而导致运行时崩溃。

    将函数参数的类型更改为Array&lt;out T&gt;。这意味着它是一个数组,您可以从中提取 Parents,但编译器会阻止您将 Parent 的任意子类型放入其中(它是 Parent 生产者,但不是消费者)。这意味着 Child1Child2 的数组是仅生成的 Parents 数组的有效子类型。

    fun <T> join(vararg collections: Array<out T>): List<T> {
        //...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      相关资源
      最近更新 更多