我有点困惑为什么以下不编译:
public <E extends Object> E doSomething() {
return new Object();
}
我对这个问题进行了一些研究,发现了各种修复方法,例如转换为(E)或使用类文字,但我仍然不确定上述内容实际上是什么问题。
答案 0 :(得分:5)
它不起作用,因为虽然E
始终是Object
类型的实例,但Object
永远不会是E
类型的实例,除了以下案例:
Object o = doSomething(); //If your code compiled, this call would work
在所有其他情况下,您会遇到问题。在您发布的代码的上下文中考虑此调用。
String s = doSomething();
这不起作用,因为您的代码总是会尝试返回Object
,即使您真的想要String
。编译器可以帮助您避免在运行时遇到这种情况。
答案 1 :(得分:1)
您尝试在方法中返回Object
,其签名表示返回E
,并声称E
可以是Object
的任何子类。如果E
完全是任何子类,那么Object
就不足以宣称自己是E
。