Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子类化类以更改Kotlin中类型参数的变量_Java_Generics_Inheritance_Types_Kotlin - Fatal编程技术网

Java 子类化类以更改Kotlin中类型参数的变量

Java 子类化类以更改Kotlin中类型参数的变量,java,generics,inheritance,types,kotlin,Java,Generics,Inheritance,Types,Kotlin,这个问题源于。关于这个问题背后的动机,请查看这里的更多信息 我有一个类,它接受一个无约束的类型参数 trait Handler<T> { fun handle(result: T) } 然而,这给了我一个错误,即“参数T被声明为'in',但出现在Handler中的'invariant'位置。这一错误意味着,就编译器所知,您的声明可能会导致运行时失败。请记住,当检查ListHandler时,编译器不知道Handler中定义了哪些成员,它只知道Handler已成功进行了类型检查

这个问题源于。关于这个问题背后的动机,请查看这里的更多信息

我有一个类,它接受一个无约束的类型参数

trait Handler<T> {
    fun handle(result: T)
}

然而,这给了我一个错误,即“参数T被声明为'in',但出现在
Handler中的'invariant'位置。这一错误意味着,就编译器所知,您的声明可能会导致运行时失败。请记住,当检查
ListHandler
时,编译器不知道
Handler
中定义了哪些成员,它只知道
Handler
已成功进行了类型检查,并且其签名表明类型参数是不变的。这是必要的,因为以后可能会更改
处理程序
,并且无需重新编译
列表处理程序

trait Handler<T> {
    fun handle(result: T)
    fun get() : T
}

请参阅完整的代码。

好的,我理解您现在所说的“这是必要的,因为以后可能会更改处理程序并重新编译,而无需重新编译ListHandler”。因此,Kotlin在编译ListHandler时无法检查Handler的成员。有道理!
trait Handler<T> {
    fun handle(result: T)
    fun get() : T
}
// an ill-behaved ListHandler
class HandlerImpl<T> : ListHandler<T> {
    private var storage: List<T> = listOf()    
    override fun handle(result: List<T>) { storage = result }    
    override fun get(): List<T> = storage    
}

// Code using it, that breaks
fun main(args: Array<String>) {
    val anyHandler = HandlerImpl<Any>()
    anyHandler.handle(listOf(1, 2, 3))

    val problematic: ListHandler<String> = anyHandler
    // The following line requires an element to be a String, but it is an Int
    problematic.get()[0].length() 
}
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String