2013-03-06 55 views
0

編輯:這個問題特別關注Java原始數組。還有其他一些問題解決了爲原始標量類型編寫泛型方法的問題,但是數組完全不同以至於需要將這個問題留作將來參考(恕我直言)。有沒有一種方法可以編寫適用於基本數組類型的通用Java方法?

考慮下面的Java方法:

private int maxIndex(double[] values, double[] maxOut) 
{ 
    int index = 0; 
    double max = values[index]; 
    for (int i = 1; i < values.length; i++) { 
     if (max < values[i]) { 
      max = values[i]; 
      index = i; 
     } 
    } 
    if (maxOut != null) { 
     maxOut[0] = max; 
    } 
    return index; 
} 

有沒有寫這方面的一個通用版本將與任何原始數字類型的工作方式?作爲一個例子,我試過如下:

private <T extends Comparable<T>> int maxIndexDoesNotWork(T[] values, T[] maxOut) 
{ 
    int index = 0; 
    T max = values[index]; 
    for (int i = 1; i < values.length; i++) { 
     if (max.compareTo(values[i]) < 0) { 
      max = values[i]; 
      index = i; 
     } 
    } 
    if (maxOut != null) { 
     maxOut[0] = max; 
    } 
    return index; 
} 

它不大概work--因爲自動裝箱不會對基本類型數組發生。不是說我真的想要拳擊,當然。我想真的就像是能夠告訴編譯器/運行時,T支持'<'運營商。有沒有辦法?

+0

沒關係,你說***陣列** *。儘管如此,您的代碼仍在使用單值泛型。 – Perception 2013-03-06 02:08:08

+2

簡答:不需要很長的答案:不會。 – 2013-03-06 05:34:02

+0

@Louis你做了我的一天ahahahahaha – 2013-03-06 12:53:03

回答

2

沒有辦法,因爲不像單個值的自動裝箱,沒有基本元素類型的集合/陣列的自動轉換其包裝器對象等效元素類型。

+0

我以爲想的很多,但想問一下我在Java泛型上看到的所有文檔都是從他們在Java 5中引入的日期開始的。我希望可能有一些額外的功能被引入更高版本。 – 2013-03-06 05:43:57

0

使用反射,你可以編寫將與原始數組或引用數組工作的方法,但你放棄類型安全的過程中:

import java.lang.reflect.Array; 

private int maxIndex(Object values, Object maxOut) 
{ 
    int index = 0; 
    Object max = Array.get(values, index); 
    for (int i = 1; i < Array.getLength(values); i++) { 
     if (((Comparable)max).compareTo(Array.get(values, i)) < 0) { 
      max = Array.get(values, i); 
      index = i; 
     } 
    } 
    if (maxOut != null) { 
     Array.set(maxOut, 0, max); 
    } 
    return index; 
}