【问题标题】:Is there a way to write generic Java methods that work with primitive array types? [duplicate]有没有办法编写适用于原始数组类型的通用 Java 方法? [复制]
【发布时间】:2013-03-06 02:06:18
【问题描述】:

编辑:这个问题专门针对 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 支持 '

【问题讨论】:

  • 没关系,你说的是数组。不过,您的代码仍在使用单值泛型。
  • 简答:否。长答:Nooooooooooooo。
  • @Louis 你让我很开心啊哈哈哈哈

标签: java arrays generics types primitive


【解决方案1】:

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

【讨论】:

  • 我想了很多,但想问一下,因为我读过的关于 Java 泛型的所有文档都可以追溯到它们在 Java 5 中的介绍。我希望以后可能会引入一些额外的功能版本。
【解决方案2】:

没有:(

但你可以代码生成:)

【讨论】:

    【解决方案3】:

    使用反射,您可以编写一个适用于原始数组或引用数组的方法,但您在此过程中放弃了类型安全:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 2010-09-26
      相关资源
      最近更新 更多