2012-01-22 197 views
2

我正在通過示例。泛型返回類型不起作用

public interface Visitor<T> { 
    public void visit(T e); 
} 

class Sum<T extends Integer> implements Visitor<T> { 

    private int sum = 0; 



    @Override 
     public void visit(T element) { 
      sum += element; 
     } 

     public T value() { 
      return sum; 
     } 

} 

return語句t值()返回的總和給出錯誤,指出類型不匹配:不能從int到T.轉換爲什麼它是如此,如何來解決這個問題。

+0

不應該是'私人T sum = 0;'? –

+0

並非所有的貓都是獅子,你知道......;-)如果T sum = 0,則爲 – Cameron

+0

;我無法將我的元素添加到總和中。我的意思是sum + = element;在第二種方法中將給出錯誤。對於參數類型T,運算符+ =未定義。 – Curious

回答

3

你的情況有兩個問題:

  1. T extends Integer是不完全有效的,因爲Integer不能擴展,即它是一個final類。因此您可以在類聲明安全更改爲

    class Sum implements Visitor<Integer> { ... 
    
  2. 其次,T value()方法不是接口的一部分,因此並不需要(不應該)T型。您可以安全地將其替換爲public int value()public Integer value()

因此產生的代碼看起來就像這樣:

class Sum implements Visitor<Integer> { 
    private int sum = 0; 

    @Override 
    public void visit(Integer element) { 
     sum += element.intValue(); 
    } 

    public int value() { 
     return sum; 
    } 
} 
+0

非常感謝。 – Curious

1

這是因爲int是Java中的原始類型,而Integer是一類。問題是你不能直接將int分配給Integer。解決辦法可能是將return sum;更改爲return (T) sum;

+0

返回新的T(sum)也不返回新的T(sum)正在工作中不能實例化類型T的錯誤。 – Curious

+0

public int value(){ \t \t return sum; \t}非常感謝你。但是想知道T(sum)的意思。 – Curious

+0

考慮到'Integer'有一個構造函數作爲'Integer(int)',我嘗試用'new T(sum)'來表示'用int創建一個新的T實例'(假設'T'爲'Integer'你更清楚的印象)。但後來我發現'Integer'是一個不能擴展(或派生)的最終類。我可以在這裏知道你的'T'和'Integer'究竟是什麼?你是指Java中默認的'Integer'? – grapeot

1

在泛型實現中,始終使用Wrapper類而不是primitive數據類型。 例如對於int,您應該同樣使用Integer進行double,float,long等。有可用的包裝類別分別爲Double, FloatLong

1

你可以利用intValue方法對Integer類(從Number實際上繼承),即

sum += element.intValue(); 

的之所以不能使用sum += element就是因爲編譯器不知道具體的類T是什麼,所以它不能autobox。 T可能Integer,但是您已聲明TT extends Integer,因此編譯器不知道實際上是什麼子類T

現在,在你的情況下,它會變得有點有趣,因爲Integer是最後一堂課。你可能會爭辯說,編譯器應該能夠找出T永遠是Integer。它顯然不會這樣做。

也許這是你不想使用泛型的情況:永遠不可能有Integer的子類,那麼爲什麼不完全擺脫泛型聲明呢?

class Sum implements Visitor<Integer> { 
    public void visit(Integer i) { 
     sum += i; 
    } 
} 

這應該工作得很好。