Java “的编译器意外警告”&书信电报;T扩展…>&引用;返回类型

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

当我编译以下Java代码时(使用Oracle JDK 1.7.025):

公共类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;
    }
}