通用继承中的不需要的类型不匹配错误

时间:2017-06-28 08:38:16

标签: java

以下代码未编译,并在line 1编译错误时给出以下错误:

  

类型不匹配:无法从fourLegged转换为Dog1

根据我的理解,它应该成功编译,不应该给出任何错误。

   public class Test1 {

    public static void main(String[] args) {
        MyAnimal obj = new MyAnimal();
        Dog1 carDoor = obj.get()//Line 1;
    }

}

class MyAnimal<C extends BlackDog> extends AbstractAnimal<C> implements Animal1 {

}

abstract class AbstractAnimal<C extends FourLegged> {

    public C get() {
        return null;
    }

}

interface Animal1 {
    public Dog1 get();
}

interface FourLegged {
}

interface Dog1 extends FourLegged {
}

interface BlackDog extends Dog1 {
}

有人可以帮助我理解这种行为。

1 个答案:

答案 0 :(得分:4)

问题是MyAnimal myCar = new MyAnimal();基本上禁用了泛型类型检查,因此代码只知道get()返回的是FourLegged

将其更改为MyAnimal<BlackDog> myCar = new MyAnimal<>();(或甚至MyAnimal<?> myCar ...,请参阅Seelenvirtuose的评论)应该可以使其正常工作。在这两种情况下,编译器都会知道C中的get()是(至少)BlackDog的实例。