[英]Is there a way to return a generic supertype without casting in Java?
[英]Cannot return supertype in generic method
一些示例代码:
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
呢?
我已经读过<? 扩展SuperType>不能应用于SuperType和get-put原理的解释,但是我在这里看不到它如何应用。
感谢
<T extends SomeType>
,我们可以确保T
始终是SomeType
的子类型,对吗?
对。
那么,为什么不能只返回超类型
SomeType
呢?
因为它可能不是T
!
这样SomeType
-假设SomeType
是Object
, T
是String
。 您建议此代码应该起作用:
String foo() {
return new Object();
}
它以另一种方式起作用-您可以为声明为返回超类型的方法返回子类型引用,但这是不同的。
修复很容易-只需将orig
更改为T
类型:
T orig = super.createSomething();
然后,它可以毫无问题地进行编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.