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

Java 检查父类是否为子类的实例,java,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>(); 还有许多其他类似的定义: class Car { } class Audi extend

我有一个类定义如下:

class Car {

}
class Audi extends Car {

}

class Seat extends Car {

}

class Mercedes extends Car {

}

class Opel extends Car {

}

...
List<Car> cars = new ArrayList<Car>();
还有许多其他类似的定义:

class Car {

}
class Audi extends Car {

}

class Seat extends Car {

}

class Mercedes extends Car {

}

class Opel extends Car {

}

...
List<Car> cars = new ArrayList<Car>();
我有一种情况,我收到了所有这些汽车的列表,定义如下:

class Car {

}
class Audi extends Car {

}

class Seat extends Car {

}

class Mercedes extends Car {

}

class Opel extends Car {

}

...
List<Car> cars = new ArrayList<Car>();

这将抛出
ClassCastException
。如何处理这种情况?

不管明显与否,这都能解决问题:

Car car = cars.get(0);
if(car instanceof Audi) {
  Audi audi = (Audi) car;
}

您可以使用
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
——这违反了面向对象编程原则。请参阅,例如:

使用instanceof检查,例如:

car instanceof Audi
Car someCar = cars.get(0);
Audi audi = null;
if(someCar instanceof Audi){
audi = (Audi) someCar;
}
if(audi != null){
//...

如果variable car是奥迪的一个实例,则返回true,否则返回false。

您可以在铸造前使用
instanceof
。例如:

car instanceof Audi
Car someCar = cars.get(0);
Audi audi = null;
if(someCar instanceof Audi){
audi = (Audi) someCar;
}
if(audi != null){
//...

但这可能是个坏主意,因为引入泛型是为了避免使用强制转换和
instanceof

您可以使用instanceof,但这颠覆了OOP原则。你想做什么?“我怎么知道哪一个是奥迪,哪一个是座位”你为什么要这么做?你的
Car
类难道没有你需要的所有Car方法吗?@AdrianLeonhard,我正试图从汽车列表中获取特定汽车的数据。我从另一个地方收到了这个列表,需要处理它。@Pshemo,没有。每个特定的汽车都有一些额外的变量和它的getter和setter。好的,在这种情况下,
instanceof
是您要找的操作符。但我仍然感兴趣的是,哪些数据可能包含
Seat
,哪些
Audi
或其他汽车不应该包含。