如何在Java中使用增强的for循环遍历不同对象的数组



我有一个类为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;
}

最新更新