有没有办法编写适用于原始数组类型的通用Java方法?

时间:2013-03-06 02:06:19

标签: java arrays generics types primitive

编辑:这个问题特别关注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支持'&lt;'运营商。有办法吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

否:(

但你可以代码生成:)

答案 2 :(得分: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;
}