2013-03-06 48 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; 
} 
相关问题