通用方法 - “未经检查的转换以符合从类型T”警告

9
如果我有以下内容:
public interface Foo {
   <T extends Foo> T getBlah();
}

public class Bar implements Foo {
   public Bar getBlah() {  
      return this;
   }
}

我在eclipse中关于Bar类中'getBlah'方法实现的部分收到了一个警告:

- Type safety: The return type Bar for getBlah from the type Bar needs unchecked conversion to conform to T from the type 
 Foo

我该怎么修复这个问题?为什么会出现这个警告提示?
谢谢。

你写道 getBlah 返回的类型必须扩展接口 Foo。但是 Bar 并没有扩展它,而是实现了它。 - vulkanino
2
'extends' 包括接口实现。 - Joeblackdev
过度泛化的一个案例。请参考Joeblackdev的评论和Alessandro Santini的回答。 - Saintali
3个回答

15
你正在覆盖接口中的一个方法,因此你的实现应该匹配规范中的签名:
public class Bar {
    @Override
    public <T extends Foo> T getBlah() {  
        return this;
    }
}

如果您计划创建一个特定参数化的整个实现的覆盖,则需要在接口定义中指定通用类型:

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

public class Bar implements Foo<Bar> {
   @Override
   public Bar getBlah() {  
      return this;
   }
}

他为什么要推断一个没有在任何地方使用的通用类型? - Alessandro Santini
我不认为这是他的全部代码。因为你知道,假设会导致错误... - Perception
第一行应该是 public interface Foo<T extends Foo<T>> 或者 public interface Foo<T extends Foo<?>> - Bob Wang

4
<T extends Foo> T getBlah();

意味着调用者可以请求返回任何类型作为T。因此,无论对象属于哪个类,我都可以请求返回我选择的其他随机的Foo子类。这样的方法能够合法地返回的唯一值是null(除非进行了不安全的强制转换),这很可能不是你想要的。


3

我不确定你想要在这里实现什么,但我认为返回Foo应该是可以的:

interface Foo {

  public Foo getBlah();

}

由于您在参数中未使用通用类型,因此需要进行翻译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接