Java 泛型继承中不需要的类型不匹配错误

Java 泛型继承中不需要的类型不匹配错误,java,Java,以下代码未被编译,在第1行出现编译错误时给出以下错误: 类型不匹配:无法从fourLegged转换为Dog1 据我所知,它应该得到成功编译,不应该给出任何错误 public class Test1 { public static void main(String[] args) { MyAnimal obj = new MyAnimal(); Dog1 carDoor = obj.get()//Line 1; } } class MyA

以下代码未被编译,在
第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 {
}
公共类Test1{
公共静态void main(字符串[]args){
MyAnimal obj=新的MyAnimal();
Dog1 carDoor=obj.get()//第1行;
}
}
类MyAnimal扩展了AbstractAnimal实现Animal1{
}
抽象类抽象动物{
公共C get(){
返回null;
}
}
界面动物1{
公共Dog1 get();
}
四脚接口{
}
接口Dog1扩展为四条腿{
}
接口BlackDog扩展Dog1{
}

有人能帮我理解这种行为吗。

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


将其更改为
MyAnimal myCar=new MyAnimal()(或者甚至是
myanimalmycar…
,参见Seelenvirtuose的评论)应该可以让它工作。在这两种情况下,编译器都会知道
get()
中的
C
至少是
BlackDog

的一个实例。请注意:如果您坚持Java代码约定(这是有原因的),它将是
FourLegged
。另外,请注意您的一般命名,
MyAnimal
myCar
似乎不太合适,在更大范围内这样做可能会引入难以发现的错误。可能是@Tom的重复-它不是重复的,请再次检查。您使用的是原始类型,并且您已经含蓄地说(使用“但为什么禁用泛型类型检查?”注释)您不知道原始类型是什么以及它的原因。@Thoms-非常感谢。但为什么要禁用泛型类型检查呢?