Java 通用方法-“;未选中转换,以符合“类型”中的T;警告

Java 通用方法-“;未选中转换,以符合“类型”中的T;警告,java,generics,Java,Generics,如果我有以下资料: public interface Foo { <T extends Foo> T getBlah(); } public class Bar implements Foo { public Bar getBlah() { return this; } } 我怎样才能解决这个问题?为什么我会收到警告 谢谢您正在重写接口中的方法,因此您的实现应该与规范中的签名相匹配: public class Bar { @Overrid

如果我有以下资料:

public interface Foo {
   <T extends Foo> T getBlah();
}

public class Bar implements Foo {
   public Bar getBlah() {  
      return this;
   }
}
我怎样才能解决这个问题?为什么我会收到警告


谢谢

您正在重写接口中的方法,因此您的实现应该与规范中的签名相匹配:

public class Bar {
    @Override
    public <T extends Foo> T getBlah() {  
        return this;
    }
}
公共类栏{
@凌驾
公共T getBlah(){
归还这个;
}
}
现在,如果您计划创建整个实现的特定参数化覆盖,则需要将泛型类型指定为接口定义的一部分:

public interface Foo<T extends Foo<T>> {
    T getBlah();
}

public class Bar implements Foo<Bar> {
   @Override
   public Bar getBlah() {  
      return this;
   }
}
公共接口Foo{
T getBlah();
}
公共类Bar实现了Foo{
@凌驾
公共栏getBlah(){
归还这个;
}
}

我不确定您想在这里完成什么,但我认为返回Foo是可以的:

interface Foo {

  public Foo getBlah();

}
因为您没有在参数中的任何位置使用泛型类型。

T getBlah();
<T extends Foo> T getBlah();

意味着调用方可以请求任何类型作为T返回。因此,无论对象是什么类,我都可以请求返回我选择的Foo的其他随机子类。这种方法可以有效返回的唯一值是
null
(除非它执行不安全的强制转换),这可能不是您想要的。

您写道
getBlah
返回的类型必须扩展接口
Foo
。但是
Bar
没有,它实现了它。“extends”包括接口实现一种过度泛化的情况。请看Joeblackdev的评论和Alessandro Santini的回答。看在上帝的份上,他为什么要推断一个没有在任何地方使用过的泛型类型?我不认为这是他的全部代码。因为你知道他们对假设的看法……第一行应该是
公共接口Foo
公共接口Foo
<T extends Foo> T getBlah();