我以前的OOP经验是使用Objective-C(动态类型),但是,我现在正在学习Java。我想迭代对象的ArrayList并对它们执行某种方法。 ArrayList中的每个对象都属于同一个类。在Objective-C中,我只是在每次迭代中检查对象是否是正确的类,然后运行该方法,但这种技术在Java中是不可能的:
for (Object apple : apples) {
if (apple.getClass() == Apple.class) {
apple.doSomething(); //Generates error: cannot find symbol
}
}
如何“告诉”编译器ArrayList中的对象属于哪个类?
答案 0 :(得分:10)
在Java 5及更高版本中,collecton类型是通用的。所以你会有这个:
ArrayList<Apple> a = getAppleList(); // list initializer
for (Apple apple : a) {
apple.doSomething();
}
除非您特别需要ArrayList
能够容纳不同类型的Object
,否则ArrayList
的{{1}}通常不是优秀做法。通常情况并非如此,您可以使用异类集合来提高类型安全性。
答案 1 :(得分:5)
对于传统铸造,请考虑以下事项:
for (Object apple : apples) {
if (apple instanceof Apple) { //performs the test you are approximating
((Apple)apple).doSomething(); //does the cast
}
}
在Java的更高版本中,引入了Generics,无需进行这些类型的测试。
答案 2 :(得分:1)
阅读section on casting from the Java Tutorial应该回答这个问题。
(或者,如果您自己声明ArrayList,请使用approapriate类型参数,因为danben suggest =
答案 3 :(得分:0)
您需要将Object
apple投射到Apple
。
((Apple)apple).doSomething();
但在这种特殊情况下,最好使用;
for(Apple apple : apples){
apple.doSomething();
}