Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Kotlin 如何使用其接口作为泛型声明变量_Kotlin - Fatal编程技术网

Kotlin 如何使用其接口作为泛型声明变量

Kotlin 如何使用其接口作为泛型声明变量,kotlin,Kotlin,我正在将一些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) {

我正在将一些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时,我得到以下错误:错误:类型不匹配:推断的类型为DogLeash,但预期为Leash。是否有一些in、out或with的组合可以让我在最后一行完成作业?

否。在makes类型中,因此狗皮带不是皮带的子类型。Leash类型的引用将允许您在任何动物上调用attachToCollarOf,而DogLeash只能与狗一起工作-编译器正确地禁止此赋值。相反,如果您有:

class AnimalLeash : Leash<Animal> {
    override fun attachToCollarOf(animal: Animal) {
        println("Attached to Animal")
    }
}
然后执行val-leash:leash=AnimalLeash将起作用:对leash的引用允许您仅在狗身上调用attachToCollarOf,但任何AnimalLeash都适用于狗。

否。在makes类型中,DogLeash不是leash的子类型。Leash类型的引用将允许您在任何动物上调用attachToCollarOf,而DogLeash只能与狗一起工作-编译器正确地禁止此赋值。相反,如果您有:

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

然后使用val leash:leash=ANMIALLEASH将有效:引用leash允许您仅在狗身上调用ATTACHTOCLALAROF,但任何ANMIALLEASH都适用于狗。

如果我不使用反变类型,我有办法完成此任务吗?将Leash接口声明为:interface Leash{fun attachToCollarOfanimal:T}也会导致类型不匹配错误。不太确定您在这里想要实现什么。您不能将DogLeash的实例分配给Leash类型的引用,因为这将允许您在Animal上调用attachToCollarOf,而DogLeash只支持在Dog上调用该方法。该注释使它在我的脑海中闪现。谢谢你的解释!如果我不把类型转换成反变的,有没有办法完成这个任务?将Leash接口声明为:interface Leash{fun attachToCollarOfanimal:T}也会导致类型不匹配错误。不太确定您在这里想要实现什么。您不能将DogLeash的实例分配给Leash类型的引用,因为这将允许您在Animal上调用attachToCollarOf,而DogLeash只支持在Dog上调用该方法。该注释使它在我的脑海中闪现。谢谢你的解释!