Java “的编译器意外警告”&书信电报;T扩展…>&引用;返回类型
当我编译以下Java代码时(使用Oracle JDK 1.7.025):Java “的编译器意外警告”&书信电报;T扩展…>&引用;返回类型,java,generics,javac,Java,Generics,Javac,当我编译以下Java代码时(使用Oracle JDK 1.7.025): 公共类StackOverflowQuestion{ 接口示例{ T init(); } 静态类ExampleImpl实现示例{ @凌驾 公共示例impl init(){ 归还这个; } } } 我得到一个警告: StackOverflowQuestion.java:11: warning: [unchecked] init() in ExampleImpl implements <T>init() in
公共类StackOverflowQuestion{
接口示例{
T init();
}
静态类ExampleImpl实现示例{
@凌驾
公共示例impl init(){
归还这个;
}
}
}
我得到一个警告:
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()
StackOverflowQuestion.java:11:警告:[未选中]初始化()
在示例中,impl在示例中实现init()
公共示例impl init(){
^
返回类型需要从ExampleImpl到T的未经检查的转换
其中T是一个类型变量:
T扩展方法init()中声明的示例
我不明白为什么它说“返回类型需要未检查的转换”,因为类实现了示例
,就我所知,它是一个有效的返回类型
有人能给我解释一下怎么回事吗?在
示例
中的泛型方法应该适用于T
可以是扩展示例
的任何类型的情况,但是您尝试在ExampleImpl
中实现它,它总是返回一个ExampleImpl
。如果ExampleImpl,这可能没问题de>是实现示例
的唯一类,但如果还有其他类,则可以在运行时获得类castexception
在下面的示例中,我们实例化了一个新的ExampleImpl
,将其转换为基本接口,然后调用泛型方法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();
}
}
公共类StackOverflowQuestion{
接口示例{
T init();
}
静态类ExampleImpl实现示例{
@凌驾
公共示例impl init(){
归还这个;
}
}
静态类ExampleImpl2实现示例{
@凌驾
公共T init(){
返回null;
}
}
公共静态void main(字符串[]args){
ExampleImpl2 e2=((示例)新ExampleImpl()).init();
}
}
我的java有点生疏,但您不能在重写的方法中返回派生类吗
公共类堆栈溢出问题{
interface Example {
Example init();
}
static class ExampleImpl implements Example {
@Override
public ExampleImpl init() {
return this;
}
}
}(对代码格式表示歉意-在手机上基本不可能)这回答了我真正的问题(如何获得我想要的行为)。我将投票,但将pbabcdefp作为可接受的答案,因为它回答了我提出的问题。实际上,它不满足我的实际需要,因为我也需要类型安全参数。例如,类欧几里德向量实现向量
和方法欧几里德向量加(欧几里德向量)
@aetheria:如果这是为了产生一个可以作为变量类型(多态性)使用的接口,那么你不能让它是泛型的。但是正如你正确猜测的那样,你的用例在多态性方面不起作用。出于兴趣,“欧几里德向量”是什么?你是说笛卡尔的吗?
interface Example {
Example init();
}
static class ExampleImpl implements Example {
@Override
public ExampleImpl init() {
return this;
}
}