2014-03-06 17 views
3

我想創建從陣列獲取最大值的通用方法。然而,我陷入了T到類型Math.max方法使用的轉換問題。在可轉換的演員陣容中,從T投射到雙倍

這裏是我的代碼: 首先,我不能初始化包括maxValue,如:

T maxVaue = 0; 

其次,我無法用數據[i]於Math.max,在這兩種情況下我得到的錯誤在敞篷演員。

class Matrix<T>{ 
    public T getMaxValue(T[] data){ 
     T maxValue; 
     for (int i=0; i<data.length; i++){ 
      maxValue = Math.max(data[i], maxValue); 
     } 
     return maxValue; 
    } 
} 

回答

3

Math.max只接受int,float,double和long。所以你不能和T一起使用它。

你可以做的是用T編寫你自己的max()方法。例如,你的方法在param中可能需要一個Comparator對象。或者你的T對象可以實現Comparable接口。

看一看這個帖子:How to implement a generic `max(Comparable a, Comparable b)` function in Java?

+1

我同意,'Comparable'是去這裏最好的方式。 –

2

你不能這樣做,因爲你這樣做是因爲T可以是任何東西。你可以例如將T限制爲Number,但是您必須選擇中間基元類型,並且仍會遇到返回值的問題。

但是,你可以只限制TComparable並使用它,例如:

class Matrix<T extends Comparable<T>>{ 
    public T getMaxValue(T[] data){ 
     T maxValue = null; 
     for (int i=0; i<data.length; i++){ 
      if (maxValue == null || data[i].compareTo(maxValue) > 0) 
       maxValue = data[i]; 
     } 
     return maxValue; 
    } 
} 

所有Java的基本類型的包裝類的實現Comparable,以及許多其他類型的:

byte by = new Matrix<Byte>().getMaxValue(new Byte[]{1, 2, 3}); 
char ch = new Matrix<Character>().getMaxValue(new Character[]{'a', 'b', 'c'}); 
int in = new Matrix<Integer>().getMaxValue(new Integer[]{1, 2, 3}); 
short sh = new Matrix<Short>().getMaxValue(new Short[]{1, 2, 3}); 
long lo = new Matrix<Long>().getMaxValue(new Long[]{1L, 2L, 3L}); 
float fl = new Matrix<Float>().getMaxValue(new Float[]{0.1f, 0.2f, 0.3f}); 
double db = new Matrix<Double>().getMaxValue(new Double[]{0.1, 0.2, 0.3}); 
boolean bo = new Matrix<Boolean>().getMaxValue(new Boolean[]{false, true}); 
String st = new Matrix<String>().getMaxValue(new String[]{"turtles", "are", "weird"}); 
BigInteger bi = new Matrix<BigInteger>().getMaxValue(new BigInteger[]{...}); 
2

T只能容納像Double,Integer這樣的類,而不是像double,int這樣的原始類型。也許只是使用內置Collections.max(Collection<T extends Comparable<T>>)Doubles代替doubles陣列像這樣的代碼示例

class Matrix<T extends Comparable<T>> { 
    public T getMaxValue(T[] data) { 
     return Collections.max(Arrays.asList(data)); 
    } 

    public static void main(String[] args) throws IOException { 
     Matrix<Double> m = new Matrix<>(); 
     System.out.println(m.getMaxValue(new Double[] { 1., 42., 3., 4., 5. })); 
    } 
}