0

編集:この質問は特にJavaプリミティブ配列に関するものです。プリミティブスカラー型のジェネリックメソッドの記述に対処する他の質問がありますが、配列は十分に異なっているため、将来の参照(IMHO)のためにこの質問を保持する必要があります。

次の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

リフレクションを使用すると、プリミティブ配列または参照配列で動作するメソッドを作成できますが、その過程で型の安全性を放棄することになります。

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 に答える
0

いいえ:(

しかし、コード生成することができます:)

于 2013-03-06T02:11:14.123 に答える