0

编辑:这个问题专门针对 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;
}

它不起作用——大概是因为自动装箱不会发生在原始类型的数组上。当然,并不是说我真的想要拳击。我真正想要的是能够告诉编译器/运行时 T 支持 '<' 运算符。有办法吗?

4

3 回答 3

2

没有办法,因为与单个值的自动装箱不同,原始元素类型的集合/数组不会自动转换为其包装对象等效元素类型。

于 2013-03-06T02:15:20.410 回答
0

不:(

但是您可以代码生成:)

于 2013-03-06T02:11:14.123 回答
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;
}
于 2013-03-06T06:32:09.207 回答