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-非常感谢。但为什么要禁用泛型类型检查呢?