检查父类是否是子类的实例

时间:2015-02-19 21:54:41

标签: java

我有一个类定义如下:

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。如何处理这种情况?

4 个答案:

答案 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