2

次の行を含むコードに取り組んでいます。

 public static int[] toArray(List<Integer> list) {
   int[] array = new int[list.size()];
   for(int i = 0; i < array.length; i++)
     array[i] = list.get(i);
   return array;
 }
 public static double[] toArray(List<Double> list) {
   double[] array = new double[list.size()];
   for(int i = 0; i < array.length; i++)
     array[i] = list.get(i);
   return array;
 }
 public static String[] toArray(List<String> list) {
   String[] data = new String[list.size()];
   for(int i = 0; i < data.length; i++)
     data[i] = list.get(i);
   return data;

コンパイル中に次のエラーが発生します。

error: name clash: toArray(List<Double>) and toArray(List<Integer>) have the same erasure
 public static double[] toArray(List<Double> list) {
                        ^
error: name clash: toArray(List<String>) and toArray(List<Integer>) have the same erasure
 public static String[] toArray(List<String> list) {
                        ^
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors

このプログラムは、私が最近ダウンロードしたオープン ソース プログラム (そして少し古い 2006 年) です。パッケージには、バイナリ バージョンとソース コードの両方が含まれています。これは、このコードが正しくコンパイルされたことを意味しますが、今はコンパイルできません。

今、私は2つの質問があります:

  1. この過負荷の何が問題になっていますか?
  2. この問題を解決するにはどうすればよいですか? これらの関数をテンプレートに基づく関数だけに置き換えてもよろしいですか? もしそうなら、どのように?

ありがとう

4

4 に答える 4

3

名前の衝突は、タイプ eraserが原因で発生します。

一方、List.toArrayメソッドを直接使用できるため、これらのメソッドはおそらくまったく必要ありません。

例えば:

List<Double> myList = new ArrayList<Double>();
Double[] myArray = myList.toArray(new Double[]{});
于 2013-06-28T07:34:41.097 に答える
3

メソッドをジェネリックにします。

 public static T[] toArray(List<T> list) {
   T[] data = new T[list.size()];
   for(int i = 0; i < data.length; i++)
     data[i] = list.get(i);
   return data;

Javaを書いてからしばらくの間、構文的に正しくないかもしれません:)しかし、解決策は保持されるはずです

于 2013-06-28T07:28:50.510 に答える
2

あなたのコードはもともとJava 4以下用に書かれたようです。

気にしないでください。Listすでにそのような方法があります。それを使用してください。

String少なくとも。プリミティブ型の場合、それはできません (型パラメーターはプリミティブ型を表すことはできません)。実行時に何にでもなるので、別の名前でメソッドを自分で作成する必要があります。これを型消去と呼びます。List<X>ListX

これは、すべてのtoArrayメソッドが実際に のプロトタイプを持っていることを意味しますtoArray(List)toIntArray()、などを作成しますtoDoubleArray()...

または、次の機能を持つ Guava を使用します。

それ以外の場合は、自分でコーディングするのは簡単です:

int[] toIntArray(final Collection<? extends Number> c)
{
    final int[] ret = new int[c.size()];
    int i = 0;
    for (final Number n: c)
        ret[i++] = n.intValue();
    return ret;
}

doubleなどについても同様に行います。

于 2013-06-28T07:34:57.763 に答える
0

ラッパー型の対応するリストからプリミティブ配列を変換する場合は、次を使用できますApache common's ArrayUtils#toPrimitive

例:

int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[list.size()]));
于 2013-06-28T07:44:00.590 に答える