Android Kotlin泛型异常

Android Kotlin泛型异常,android,generics,kotlin,Android,Generics,Kotlin,好的,我有三种接口类型 移动 Animal与子接口Cat,Dog,Horse AnimalMovement 移动界面 interface Movement<T : Animal> { fun moveAnimal(type:T) } 动物运动 interface CatMovement : Movement<Cat> 问题 fun TestGenerics() { var catMovement : Movement<Cat> = Cat

好的,我有三种接口类型

  • 移动
  • Animal
    与子接口
    Cat
    Dog
    Horse
  • AnimalMovement
  • 移动界面

    interface  Movement<T : Animal> {
        fun moveAnimal(type:T)
    }
    
    动物运动

    interface CatMovement : Movement<Cat>
    
    问题

    fun TestGenerics() {
        var catMovement : Movement<Cat> = CatMovementImpl() // this works
        var catMovement : Movement<Animal> = CatMovementImpl() // this doesn't?
    }
    
    fun TestGenerics(){
    var catMovement:Movement=CatMovementImpl()//这是有效的
    var catMovement:Movement=CatMovementImpl()//这不是吗?
    }
    

    我相信在Java中,这两行代码都可以很好地工作。但是,在Kotlin中,第二行无法执行。为什么会这样?动物是猫的基本类型,所以这应该是正确的吗?

    我不是科特林的专家,但这似乎很正常:

    当这样宣布时:

    var animalMovement : Movement<Animal>
    
    var animalMovement : Movement<Animal> = CatMovementImpl()
    
    interface Movement<out T : Animal> {
        fun moveAnimal(type: T) // error
    }
    
    但如果这样分配:

    var animalMovement : Movement<Animal>
    
    var animalMovement : Movement<Animal> = CatMovementImpl()
    
    interface Movement<out T : Animal> {
        fun moveAnimal(type: T) // error
    }
    
    var animalMovement:Movement=CatMovementImpl()
    

    是允许的,这意味着你的
    CatMovementImpl
    应该能够移动狗?

    我不是Kotlin的专家,但这似乎很正常:

    当这样宣布时:

    var animalMovement : Movement<Animal>
    
    var animalMovement : Movement<Animal> = CatMovementImpl()
    
    interface Movement<out T : Animal> {
        fun moveAnimal(type: T) // error
    }
    
    但如果这样分配:

    var animalMovement : Movement<Animal>
    
    var animalMovement : Movement<Animal> = CatMovementImpl()
    
    interface Movement<out T : Animal> {
        fun moveAnimal(type: T) // error
    }
    
    var animalMovement:Movement=CatMovementImpl()
    
    是允许的,这意味着您的
    CatMovementImpl
    应该能够移动狗?

    评论中所说的是正确的


    我很确定这在Java中也不起作用。一个
    移动
    在评论中已经建议使用
    out
    ,这不是
    运动的子类型。

    评论中所说的是正确的


    我很确定这在Java中也不起作用。一个
    移动

    在注释中已经建议使用
    out
    ,这不是
    运动的一个子类型。

    我很确定这在Java中也不起作用。
    Movement
    不是
    Movement的子类型。它应该是
    out Animal
    ?m0skito您似乎是对的。我很确定这在Java中也不起作用。
    Movement
    不是
    Movement的子类型。是否应该是
    out Animal
    ?M0ski你似乎是对的。我可以看出我的逻辑有缺陷。这一点和m0skito在这个问题下的评论或许能提供一些启示。我正在重新审视手头的任务,我可以看出我的逻辑有何缺陷。这一点和m0skito在这个问题下的评论或许能提供一些启示。我正在重温手头的任务我只想补充一点,你不能在
    移动中调用
    moveAnimal
    ,这对这个界面来说尤其无用。我只想补充一点,你不能在
    移动中调用
    moveAnimal
    ,这对这个界面来说尤其无用。