重複の可能性:
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 プログラマーとして働いており (特に経験豊富なプログラマーでもありません)、そこを一般化すると、問題 (タイプの強制がないため)。
前もって感謝します!