当我编译以下 Java 代码时(使用 Oracle JDK 1.7.0_25):
public class StackOverflowQuestion {
interface Example {
<T extends Example> T init();
}
static class ExampleImpl implements Example {
@Override
public ExampleImpl init() {
return this;
}
}
}
我收到警告:
StackOverflowQuestion.java:11: warning: [unchecked] init()
in ExampleImpl implements <T>init() in Example
public ExampleImpl init() {
^
return type requires unchecked conversion from ExampleImpl to T
where T is a type-variable:
T extends Example declared in method <T>init()
我不明白为什么它说“返回类型需要未经检查的转换”,因为该类实现了 Example
,据我所知,它是一个有效的返回类型。
谁能给我解释一下这是怎么回事?
最佳答案
Example
中的泛型方法应该在哪里工作 T
可以是扩展 Example
的任何类型, 但您已尝试在 ExampleImpl
中实现它以这样一种方式,它总是返回一个 ExampleImpl
.这可能没问题,如果 ExampleImpl
是唯一实现 Example
的类, 但如果还有其他人,您可以获得 ClassCastException
在运行时。
在下面的例子中,我们实例化了一个新的 ExampleImpl
,将其转换为基接口(interface),然后调用泛型方法 init()
与 T
等于ExampleImpl2
.这应该返回 ExampleImpl2
, 但自从你返回 this
, 它会抛出 ClassCastException
.这就是您的代码必须生成警告的原因。
public class StackOverflowQuestion {
interface Example {
<T extends Example> T init();
}
static class ExampleImpl implements Example {
@Override
public ExampleImpl init() {
return this;
}
}
static class ExampleImpl2 implements Example {
@Override
public <T extends Example> T init() {
return null;
}
}
public static void main(String[] args) {
ExampleImpl2 e2 = ((Example) new ExampleImpl()).<ExampleImpl2>init();
}
}
关于java - "<T extends ...>"返回类型的意外编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708667/