我有一个类为Car、Bicycle和Van的对象数组。我想遍历所有对象并执行go()
方法。一个类的go()
是这样的。
public class Van extends Vehicle {
@Override
public void go() {
System.out.println("Van started");
}
}
这些类都继承了Vehicle类。因此,当我初始化一个类型为Vehicle[]
的数组时,它可以正常工作。
现在我想对Object[]
数组做同样的事情。但是,由于对象的类型不同,我得到一个错误,要求将x转换为相关的数据类型(在本例中为Car、Van或Bicycle)。我尝试使用x.getClass()
,但它给了我答案类车,类自行车等。当我尝试执行go()
方法时,我得到一个错误说The method go() is undefined for the type Class<capture#3-of ? extends Object>
public class App {
public static void main(String[] args) throws Exception {
Car car = new Car();
Bicycle bicycle = new Bicycle();
Van van = new Van();
Object[] racers = {car, bicycle, van};
for(Object x : racers) {
System.out.println(x.getClass());
x.getClass().go(); // error - The method go() is undefined for the type Class<capture#3-of ? extends Object>
}
}
}
找到答案了
public class App {
public static void main(String[] args) throws Exception {
Car car = new Car();
Bicycle bicycle = new Bicycle();
Van van = new Van();
Object[] racers = {car, bicycle, van};
for(Object x : racers) {
System.out.println(x.getClass());
((Vehicle) x).go(); // this is the only change I made
}
}
}
Vehicle[] racers = {car, bicycle, van};
for (Vehicle x : racers) { ... x.go();
动态检测也可以工作。你可以使用现代的Stream<?>
。
Object[] racers = {car, bicycle, van};
Arrays.stream(racers)
.filter(r -> r instanceOf(Vehicle)
.map(Vehicle.class::cast)
.forEach(r -> {
r.go(); ...
};
必须使用"instanceof"关键字
Object o = "testString";
if (o instanceof Integer) {
System.out.println("is Integer");
return
}
if (o instanceof String) {
System.out.println("is String");
return;
}