以下代码未编译,并在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 {
}
有人可以帮助我理解这种行为。
答案 0 :(得分:4)
问题是MyAnimal myCar = new MyAnimal();
基本上禁用了泛型类型检查,因此代码只知道get()
返回的是FourLegged
。
将其更改为MyAnimal<BlackDog> myCar = new MyAnimal<>();
(或甚至MyAnimal<?> myCar ...
,请参阅Seelenvirtuose的评论)应该可以使其正常工作。在这两种情况下,编译器都会知道C
中的get()
是(至少)BlackDog
的实例。