我正在将一些Java代码转换为Kotlin,并且遇到了一些基本上如下所示的代码:
interface Animal {}
class Dog : Animal {}
interface Leash<in T: Animal> {
fun attachToCollarOf(animal: T)
}
class DogLeash : Leash<Dog> {
override fun attachToCollarOf(animal: Dog) {
TODO("Not yet implemented")
}
}
val foo: Leash<Animal> = DogLeash
尝试将给定类型的
foo
分配给DogLeash()
时,出现以下错误:error: type mismatch: inferred type is DogLeash but Leash<Animal> was expected
。是否有in
,out
或with
的某种组合可以使我在最后一行进行分配? 最佳答案
否。in
使类型为contravariant,因此DogLeash
不是Leash<Animal>
的子类型。类型为Leash<Animal>
的引用将允许您在任何attachToCollarOf
上调用Animal
,而DogLeash
仅可与Dog
一起使用-编译器正确地禁止了此分配。相反,如果您有:
class AnimalLeash : Leash<Animal> {
override fun attachToCollarOf(animal: Animal) {
println("Attached to Animal")
}
}
然后执行
val leash: Leash<Dog> = AnimalLeash()
将起作用:对Leash<Dog>
的引用仅允许您在attachToCollarOf
上调用Dog
,但是任何AnimalLeash
均可用于Dog
。关于kotlin - 我如何使用其接口(interface)作为泛型来声明变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60982908/