嗨,下面的代码给出了编译错误,但我不明白为什么。
class SomeClass <T extends BaseClass> {
T method(T x) {
return x; // OK
}
T method() {
return new BaseClass(); // compile error
}
}
错误显示需要 T
但提供 BaseClass
.
同样的这个:
class SomeClass {
<T extends BaseClass> T method(T x) {
return x; // OK
}
<T extends BaseClass> T method() {
return new BaseClass(); // compile error
}
}
我知道可以这样解决:
class SomeClass <T extends BaseClass> {
T method(T x) {
return x; // OK
}
@SuppressWarnings( "unchecked" )
T method() {
return (T) new BaseClass(); // OK
}
}
但是我可以解释一下为什么这是不允许的吗?
1条答案
按热度按时间rks48beu1#
这就是继承的原理。假设你有一个超类a,它有子类b和c。现在假设您的方法接受a类型的参数并返回b类型的对象。您的方法将接受c类型的对象作为参数,但是您无法返回它们,因为它们不是b类型,即使b和c都是a的子类。