重新分配通用Java变量

时间:2013-09-17 19:03:58

标签: java generics

我有点困惑为什么以下不编译:

public <E extends Object> E doSomething() {
    return new Object();
}

我对这个问题进行了一些研究,发现了各种修复方法,例如转换为(E)或使用类文字,但我仍然不确定上述内容实际上是什么问题。

2 个答案:

答案 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