gpt4 book ai didi

kotlin - 如何使用其接口(interface)作为泛型声明变量

转载 作者:行者123 更新时间:2023-12-02 13:11:40 25 4
gpt4 key购买 nike

我正在将一些 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 的某种组合? , outwith这将允许我在最后一行做作业?

最佳答案

号码in制作类型 contravariant , 所以 DogLeash不是 Leash<Animal> 的子类型. Leash<Animal> 类型的引用将允许您调用 attachToCollarOf在任何 Animal , 而 DogLeash只能使用 Dog s - 编译器正确地禁止这个赋值。相反,如果您有:

class AnimalLeash : Leash<Animal> {
override fun attachToCollarOf(animal: Animal) {
println("Attached to Animal")
}
}

然后做 val leash: Leash<Dog> = AnimalLeash()可行:对 Leash<Dog> 的引用允许您调用 attachToCollarOfDog仅 s,但任何 AnimalLeashDog 工作.

关于kotlin - 如何使用其接口(interface)作为泛型声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60982908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com