2012-02-21 122 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(除非它進行不安全的轉換),這可能不是您想要的。