2013-06-30 30 views
1

我正在嘗試學習Java中的泛型。如何在計算面積法中使用泛型?

我創建了一個盒子類。

package com.generic;

public class Box<T> { 

    T length; 
    T breadth; 
     // Setter and getter 

} 

現在我想創造caluclate這將是length * breadth框的區域的方法。

我已通用的,所以我可以使用龍,雙,整數等

但是,當我試圖創建這樣

T area(T w , T h) 
    { 
     return (w * h); 
    } 

的方法calculateArea但它給我編譯時錯誤。

我認爲乘法不能在泛型上執行。

那麼,我能做些什麼來使我的area方法通用?

謝謝。

+0

所以我怎麼能寫面積法對價值類型進行原始操作不僅沒有? – smith

+0

您不能將*,+, - 或/與T –

+0

它可以是長,雙,整數 – smith

回答

4

我不認爲這有什麼好的解決方案。不管怎樣,試試這個

class Box<T extends Number> { 
    T length; 
    T breadth; 

    T area(T w , T h) { 
     if (w instanceof Double) { 
      return (T) w.getClass().cast(w.doubleValue() * h.doubleValue()); 
     } 
     if (w instanceof Long) { 
      return (T) w.getClass().cast(w.longValue() * h.longValue()); 
     } 
     if (w instanceof Integer) { 
      return (T) w.getClass().cast(w.intValue() * h.intValue()); 
     } 
     throw new IllegalArgumentException(); 
    } 
} 
+0

是的,沒有解決方案比以上。原因在於算術運算符在原始類型上工作,而不是在類上(通用或不是)。由於原始類型不明確,因此不能對數字進行裝幀。 –

0

由於T是一個對象,你要執行「*」就可以了,你需要你內心的對象是原語,但只有數字。

'T'也可以是一個字符串或布爾值,所以java必須保護您在任何給定'T'上使用'*'。

您需要泛型才能以「int」,「float」或「double」的形式自動將您的圖元自動裝箱並取消裝箱,並進行計算並將其裝箱。

我不知道是否可以按照您編寫Area方法的方式完成。

編輯:

或者,您可以使用葉夫公司發佈的答案,做手工的拳擊/拆箱...

1

這可能工作

public class Box<T extends Number> { 

T length; 
T breadth; 
// Setter and getter 


public T getLength() { 
    return length; 
} 

public void setLength(T length) { 
    this.length = length; 
} 

public T getBreadth() { 
    return breadth; 
} 

public void setBreadth(T breadth) { 
    this.breadth = breadth; 
} 

Number area(T w , T h) 
{ 
    return (w.doubleValue()*h.doubleValue()); 
} 
} 
0

編譯器不知道編譯時爲T,無論是Tvalue type還是reference type。它會給編譯時錯誤,因爲我們可以在引用類型 所以你必須告訴編譯器T的種類預先

class Box<T extends whatYouWant> { 
    T length; 
    T breadth; 
//more stuff 
}