0

それぞれが異なる型を格納する 2 つの Generic ArrayLists があると想像してください。私のプログラムは、これらの ArrayList を一度に 1 つだけ使用します。両方の ArrayList を格納できる一般的な ArrayList (currentArrayList) を作成し、キャストせずに 2 つの ArrayList を使用することは可能ですか。

ArrayList<Integer> arrInt = new ArrayList<>();
arrInt.add(10);
ArrayList<String> arrString = new ArrayList<>();
arrString.add("ten");

ArrayList<XXX> currentArrayList = arrInt;
Integer i = currentArrayList.get(0);

currentArrayList = arrString;
String str = currentArrayList.get(0);

ありがとう。

4

3 に答える 3

1

とにかく最終的にオブジェクトのタイプを決定する必要があります。

「suppresswarning("casting")」のような警告を避けたいと思いますか?

もしそうなら、ここに行きます:

  ArrayList<Object> list = new ArrayList<Object>();
  list.add(1);
  list.add("abc");
  list.add(new Double(3.1415926));
  list.add(true);

  for (Object o : list) {
     // or more accurate
     String type;
     if (o instanceof Integer) {
        type = "int";
        // logic here...
        int i = (Integer) o; // no casting warning
     } else if (o instanceof String) {
        type = "string";
        // logic here...
     }
     // other possibilities if you want
     else { // unmatched
        type = o.getClass().getSimpleName();
     }
     System.out.println(type + ": " + o);
  }
于 2012-10-19T09:17:28.920 に答える
1

問題は、あなたがしたい部分です:

キャストせずに 2 つの ArrayList を使用します。

絶対に起こりません。静的型システムの要点は、明示的に要求せずに一般的な型を特定の型として扱うことができないようにすることです。

たとえば、次のように言えます。

ArrayList<?> currentArrayList = arrInt;
Object i = currentArrayList.get(0);

しかし、これiはただの であることに注意してください。したがって、コンパイラーは満足しています。これは Java プログラムであるため、配列内のものは に基づいObjectている必要があることを除いて、何もわかりません。Objectしかし、あなたは言いたい:

ArrayList<?> currentArrayList = arrInt;
Integer i = currentArrayList.get(0);

キャストなしでは決して起こらないのは、その 2 番目の行です。

UPDATEコメントからの質問:

コンパイラは、 arrInt のジェネリック型を見て ArrayList の型を簡単に推測できませんか?

それが私たちのためにそれをしたとしましょう。currentArrayList次に、次の行が表示されたときにのタイプをどうする必要がありますか。

currentArrayList = arrString;

あなたのコードは、コンパイラがそのような推論を行わないことを前提としています。その 2 番目の割り当てをコメントアウトするとします。これで、コンパイラは提案された推論を行い、コードをコンパイルできるようになりますしかし、将来、2 番目の割り当てを元に戻すと、コードの残りの部分がコンパイルを停止します。これは不必要に混乱を招くでしょう。

于 2012-10-19T09:08:03.980 に答える
0

質問を誤解しました-一体なぜそれをしたいのですか? タイプのないポインターを使用しているだけで、新しいArrayListを作成していません-それでも同じArrayListです!

ArrayList<ArrayList<Object>> array = new ArrayList<ArrayList<Object>>();
array.add(new ArrayList<Integer>());
array.add(new ArrayList<String>());

他のすべての可能なオブジェクトはオブジェクトから継承されるため、受け入れられるため、これでうまくいくはずです。

于 2012-10-19T09:05:32.963 に答える