0

我有一个空的抽象基类

abstract class Base{
    Base(){}
}

然后我有几个类扩展了这个基类

class A extends Base{

}

然后我将这些类实例化并放入列表中。

 A it = new A();
 ArrayList<Base> list = new ArrayList<Base>();
 list.add(it);  // add A object

然后我想做类似的事情

   for(Base msg : List){
       if( msg instanceof A){
             A obj = (A)msg; 
        }

    }
But I'm getting errors.

我究竟做错了什么

4

3 回答 3

0

不要检查它是否为 A。考虑一下

abstract class Base{
    Base(){}
    void doSomething() { System.out.println("AwesomePossum"); }
}

class A extends Base {
    @Override void doSomething() { System.out.println("Frankie O'Malley"); }
}

然后,当你迭代时,而不是做类似的事情

for(Base msg : list) {
    if(msg instanceof A) // BAD
}

做这个:

for(Base msg : List) {
    msg.doSomething();
}
于 2012-10-17T13:56:42.940 回答
0

我通常希望Base声明由 提供的方法A,因此您可以拉出Base引用并使用它,而不管实现是A.

如果您列表中的类型不遵守通用接口合同,我会质疑您为什么将它们放在一个列表中。这会让生活变得非常困难。

于 2012-10-17T13:57:31.530 回答
0
 for(Base msg : List){<---List is used variable name is list

您没有使用变量list进行迭代,而是使用List. 这就是您遇到错误的原因。

它应该是

for(Base msg : list)
于 2012-10-17T13:58:11.770 回答