1
    ArrayList<classA> aList = /*I then fill this array*/
    ArrayList<classB> bList = /* I then fill this array too*/

    /*Now put them both in the following ArrayList of Objects*/
    ArrayList<Object> myObjs =  new ArrayList<Object>();
    myObjs.add(aList);
    myObjs.add(bList);

    /*The following two lines however fails at run time*/
    ArrayList<classA> x = (ArrayList<classA>) myObjs.get(0);
    ArrayList<classB> x = (ArrayList<classB>) myObjs.get(1);

別のスレッドから、「実行時に成功する可能性がある場合はダウンキャスティングが許可される」と読んだところです。

上記のコードの問題を教えてもらえますか?どうもありがとうございます!

4

3 に答える 3

2

ジェネリックに関するJavaチュートリアルから:

次の方法を検討してください。

public void boxTest(Box<Number> n) { /* ... */ } 

どのような種類の議論を受け入れますか?その署名を見ると、型が。である単一の引数を受け入れることがわかりますBox<Number>。しかし、それはどういう意味ですか?Box<Integer>ご想像のとおり、またはを渡すことはできBox<Double>ますか?答えは「いいえ」です。なぜなら、はのサブタイプではないからBox<Integer>です。Box<Double>Box<Number>

言い換えるclassAと、はのサブクラスですがObject、のサブタイプでArrayList<classA>はありませんArrayList<Object>

于 2012-07-28T14:08:29.217 に答える
0

問題は、toをキャストすることはObjecttoをキャストすることclassAと同じではないということです。また、オブジェクト名ではなく、クラス名をテンプレートパラメータとして使用する必要があります。ArrayList<Object>ArrayList<classA>

于 2012-07-28T14:08:40.043 に答える
0

これは面白い質問だと思いました。私はサンプルコードをいじっていますが、これはうまくいきます!! このコードは、この驚くべきオンラインIDEツール(http://ideone.com/ )で試すことができます。このツールは、コードの出力をオンラインで無料でコンパイルして表示します。

import java.util.List;
import java.util.ArrayList;

class MyClass{

public static void main(String []args){

ArrayList<Integer> a = new ArrayList<Integer>();
a.add(10);
a.add(100);

ArrayList<String> b = new ArrayList<String>();
b.add("10");
b.add("100");

ArrayList<ArrayList> o = new ArrayList<ArrayList>();
o.add(a);
o.add(b);

a = o.get(0);
b= o.get(1);

System.out.println("int"+a.get(0));
System.out.println("string"+b.get(0));

System.out.println("Online IDE Works");
}

}

問題は、ArrayLists自体のArrayListがあることです。ダウンキャストは、ObjectstoArrayListsでは機能しません。ただし、上記のサンプルコードのように、内部ArrayListのジェネリック型を指定せずに、paramをArrayList自体として指定すると、完全な出力が得られます。

于 2012-07-28T14:58:01.067 に答える