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是 的子类ObjectArrayList<classA>也不是子类型ArrayList<Object>

于 2012-07-28T14:08:29.217 回答
0

问题是投射ObjectclassA与投射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。向下转换不适用于 ArrayLists 的对象。然而,就像上面的示例代码一样,如果您将参数作为 ArrayList 本身而不为内部 ArrayList 提供泛型类型,那么您将获得完美的输出!

于 2012-07-28T14:58:01.067 回答