2012-02-21 93 views
8

“未转换成与类型符合T”如果我有以下几点:泛型方法 - 警告

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

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

我得到一个警告在Eclipse关于“getBlah”类酒吧执行:

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

我该如何解决这个问题?为什么我会收到警告?

感谢

+0

你写过'getBlah'返回的类型必须扩展接口'Foo'。但是'Bar'没有,它实现了它。 – vulkanino 2012-02-21 17:03:58

+2

'扩展'涵盖了接口实现 – Joeblackdev 2012-02-21 17:05:10

+0

过度泛化的情况。看到Joeblackdev的评论和Alessandro Santini的回答。 – Saintali 2012-02-21 17:15:03

回答

13

您从接口覆盖的方法,让你实现你应该符合您的规范签名:

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

现在,如果你是不是在建立一个专门parametized覆盖计划那么您需要指定通用类型作为接口定义的一部分:

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

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

为什么在上帝的名下,他应该推断一种在任何地方都不使用的泛型? – 2012-02-21 17:11:07

+0

我不认为这是他的整个代码。因为你知道他们对假设的看法...... – Perception 2012-02-21 17:17:02

+0

第一行应该是'public interface Foo >'或'public interface Foo >'。 – 2012-02-21 17:37:04

3

我不是你不是在参数使用泛型类型的任何地方

interface Foo { 

    public Foo getBlah(); 

} 

:你想在这里完成知道该怎么做,但我认为这回美孚将确定。

4
<T extends Foo> T getBlah(); 

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