我有一个类定义如下:
class Car {
}
还有许多其他定义如下:
class Audi extends Car {
}
class Seat extends Car {
}
class Mercedes extends Car {
}
class Opel extends Car {
}
...
我有一种情况,我会收到所有这些车辆的清单,其定义如下:
List<Car> cars = new ArrayList<Car>();
在该列表中有许多不同的汽车,那么如何找出哪一辆是奥迪,哪一辆是座椅等?
我曾尝试为我知道属于奥迪的汽车做这件事:
Audi audi = (Audi) cars.get(0);
这会引发ClassCastException
。如何处理这种情况?
答案 0 :(得分:6)
您可以使用instanceof
:
Car car = cars.get(0);
if (car instanceof Audi) {
// It's an Audi, now you can safely cast it
Audi audi = (Audi) car;
// ...do whatever needs to be done with the Audi
}
但是,实际上你应该谨慎地使用instanceof
- 这违背了面向对象的编程原则。例如,请参阅:Is This Use of the "instanceof" Operator Considered Bad Design?
答案 1 :(得分:3)
明显与否,这将解决问题:
Car car = cars.get(0);
if(car instanceof Audi) {
Audi audi = (Audi) car;
}
答案 2 :(得分:3)
使用instanceof检查,例如:
car instanceof Audi
如果变量car是Audi的一个实例,则返回true,否则返回false。
答案 3 :(得分:2)
您可以在投射前使用instanceof
。例如:
Car someCar = cars.get(0);
Audi audi = null;
if(someCar instanceof Audi){
audi = (Audi) someCar;
}
if(audi != null){
//...
但可能这是一个坏主意,因为引入了泛型以避免使用强制转换和instanceof
。