一些示例代码:
public class Main {
class SomeType {
}
class A {
protected <T extends SomeType> T createSomething()
{
return null; // Don't worry about this.
}
}
class B extends A {
@Override
protected <T extends SomeType> T createSomething()
{
SomeType orig = super.createSomething();
// do some stuff with orig
return orig;
}
}
}
我在这里弄错了什么?
在线
return orig;
编译器吐出错误
Type mismatch: cannot convert from Main.SomeType to T
感谢<T extends SomeType>
,我们可以确定T
始终是SomeType
的子类型,对吧?那么为什么我不能只返回超类型SomeType
?
我已经阅读了<? extends SuperType> cannot be applied to SuperType和Explanation of the get-put principle,但我不知道它是如何应用的。
答案 0 :(得分:6)
感谢
<T extends SomeType>
,我们可以确定T
始终是SomeType
的子类型,对吧?
右。
那么为什么我只能返回超类型
SomeType
?
因为它可能不是T
!
这样说 - 假设SomeType
为Object
,T
为String
。您建议此代码应该有效:
String foo() {
return new Object();
}
它以其他方式运行 - 您可以为声明为返回超类型的方法返回子类型引用,但是&#39 ;不同。
虽然修复很简单 - 只需将orig
更改为T
类型:
T orig = super.createSomething();
然后它编译没有任何问题。