Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写泛型抽象方法';s返回类型没有类型安全警告_Java_Generics_Abstract - Fatal编程技术网

Java 重写泛型抽象方法';s返回类型没有类型安全警告

Java 重写泛型抽象方法';s返回类型没有类型安全警告,java,generics,abstract,Java,Generics,Abstract,在一些超类中,我有一个抽象的泛型方法: protected abstract <T extends Foo> T getFoo(); 其中public类子对象扩展了Foo 在我的子类的getFoo中,我得到了以下错误 “类型安全性:类型子类中getFoo()的返回类型subfo需要未经检查的转换,以符合类型超类中的T” 我的问题是: 1) 是否存在这样不安全的情况 2) 如果不是的话,编译器难道不能弄明白吗?是什么阻止编译器在编译时发现subfo是Foo的一个子类 3) 有没有办法

在一些超类中,我有一个抽象的泛型方法:

protected abstract <T extends Foo> T getFoo();
其中
public类子对象扩展了Foo

在我的子类的
getFoo
中,我得到了以下错误

“类型安全性:类型子类中getFoo()的返回类型subfo需要未经检查的转换,以符合类型超类中的T”

我的问题是:

1) 是否存在这样不安全的情况

2) 如果不是的话,编译器难道不能弄明白吗?是什么阻止编译器在编译时发现subfo是Foo的一个子类


3) 有没有办法做到这一点,但不需要警告?

是的,这是不安全和非法的。您编写的
超类
声明允许调用方(而不是
超类
子类)选择它想要的
Foo
的子类型,因此您在
子类
中的实现无法正确实现它


相反,您必须将
T
作为
超类
本身的通用参数,而不仅仅是方法:
超类
,然后
子类扩展了本质上不安全的超类

。如果我用另一个类型参数调用你的方法怎么办?@Oren你这样做违反了Liskov替换原理。。。你的超类型不能被你的子类型所取代。你不知道非法(它编译了,还没有人来逮捕我:),但我现在明白了这是多么不安全。谢谢你的快速回复,你的回答解决了我的问题。
@Override
protected SubFoo getFoo() {             
    return new SubFoo();
}