我正在将一些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。是否有inoutwith的某种组合可以使我在最后一行进行分配?

最佳答案

否。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/

10-13 04:22