3

重複の可能性:
Java: プリミティブ データ型の配列が自動ボックス化されない

私は最近 Java をやっています (私の現在の仕事には Java がまったく関係していないので、主に大学で行ったことの要約として)。

私は Oracle Java Web サイトで Generics チュートリアルを行ってきましたが、少し変更した次の例に困惑しました。

public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) {
    int count = 0;
    for (Integer e : anArray)
        if (e.compareTo(elem) > 0)
            ++count;
        return count;
}

そして、このメソッドを使用して、整数配列を次の整数と比較します。

Integer [] numarr = {1, 2, 3, 4 , 5};
Integer num = new Integer(5);

int count = Util.countGreaterThan(arrnum, num);

これはうまくいくように見えますが、プリミティブ配列とプリミティブ int を渡すとうまくいきません:

int [] arrnum = {1, 2, 3, 4 , 5};
int othernum = 3;

int count = Util.countGreaterThan(arrnum, othernum);

コンパイラは次のように文句を言います:

method countGreaterThan in class Generics.Util 
cannot be applied to given types;
required: Integer[],Integer
found: int[],int
reason: no instance(s) of type variable(s) 
Integer exist so that argument type int conforms to formal parameter type Integer

チュートリアルは、Java が常に必要に応じてオブジェクトとプリミティブを自動ボックス化/ボックス化解除することをかなり断固としているように見えましたが、この特定のケースではそれを行いません。何が欠けていますか?

また、この比較方法を可能な限り一般化する良い方法は何でしょうか? Integer の代わりに T を使用すると、渡したものではなく、T オブジェクトが検索されます。

投稿が混乱を招き、上記の内容についてかなり無知に見える場合は、私が主に perl プログラマーとして働いており (特に経験豊富なプログラマーでもありません)、そこを一般化すると、問題 (タイプの強制がないため)。

前もって感謝します!

4

2 に答える 2

1

以下のコードは、私が見る限りうまくいくようです:

public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) {
    int count = 0;
    for (Integer e : anArray) {
        if (e.compareTo(elem) > 0)
            ++count;
        return count;
}

警告が表示されますが"The type parameter Integer is hiding the type Integer"@ErichSchreinerここで自動ボクシングが機能しない理由の説明については、の回答を参照してください。

メソッドの適切な一般化は次のようになります。

public static <T extends Comparable<? super T>> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray) {
        if (e.compareTo(elem) > 0) {
            ++count;
        }
    }
    return count;
}

あなたが本当に気にかけているのは、それanArrayが同じ型の要素を持ち、elemそれ自身の型に匹敵するということだけです。

于 2012-07-11T08:27:42.980 に答える
1

の宣言はcountGreaterThan()、組み込みの typeを非表示にしIntegerます。明確にするために、わずかに変更されたバージョンを検討してください。

public static <I extends Comparable<I>> int countGreaterThan(I [] anArray, I elem) {
    int count = 0;
    for (I e : anArray)
        if (e.compareTo(elem) > 0)
            ++count;
        return count;
}

これで、オートボクシングが行われないため、2 回目の呼び出しが機能しないことが明らかになるはずです。ジェネリックが機能するには、プリミティブではなくオブジェクトを提供する必要があります。

于 2012-07-11T08:28:28.880 に答える