提问者:小点点

将java通用转换为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
    }
}

请帮助我,我如何修复此错误?

不知道如何解决它


共1个答案

匿名用户

我认为这是Java数组类型实现设计中的一个错误,允许您这样做。这使得<code>T</code>(在本例中为父级)被放入只能接受<code>T</code<的某个子类型的数组中的可能性很大,这将在运行时引发异常。

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

将函数参数的类型更改为Array

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