如果在 Kotlin 中泛型是 Int,泛型如何工作?

Man*_*ell 5 generics kotlin

我试图制作抽象类进行测试,因为我发现使用泛型的奇怪问题

abstract class Test<T> {
    open fun hello(vararg data: T) {
        print("Default function")
    }
}
Run Code Online (Sandbox Code Playgroud)

这个非常简单的抽象类有一个带有vararg关键字的打开方法。可以通过创建另一个扩展Test类的类来重现问题。

class Hello : Test<Int>() {
    //Problem 1
    override fun hello(vararg data: Int) {
        super.hello(*data) //Problem 2
        println("Override function")
    }
}
Run Code Online (Sandbox Code Playgroud)

关于第一个问题,Kotlin 说方法不会覆盖任何东西,即使这个方法肯定会覆盖某些东西。奇怪的是,这个错误是随机发生的,所以我不知道重现这个错误的确切方法

Kotlin 无法识别代码

当我添加一些代码(例如非常简单的代码,例如println()等)时,此错误已被删除,但是当您编译时,它再次导致相同的错误。

关于第二个问题,super.hello(*data)导致问题,因为这需要Array<out Int>,但发现参数是IntArray。我认为 Kotlin 正在考虑IntArrayArray<*>作为不同的类,但它不应该像这样......

在此处输入图片说明

我正在使用 Kotlin 1.4.10,根据网站,它似乎是最新版本。

我发布这个是为了检查这两个问题是否是错误,或者我是否做错了什么,因为当我将 generic 更改为 时String,所有问题都会被删除。我在上面的这些示例代码中有什么错误吗?

eph*_*ent 4

已知问题:https ://youtrack.jetbrains.com/issue/KT-9495

作为解决方法,您可以使用盒装java.lang.Integer.

class Hello : Test<Integer>() {
    override fun hello(vararg data: Integer) {
        super.hello(*data)
        println("Override function")
    }
}
Run Code Online (Sandbox Code Playgroud)