【问题标题】:Check if parent class is instance of child class检查父类是否是子类的实例
【发布时间】:2015-02-19 21:54:40
【问题描述】:

我有一个这样定义的类:

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

【问题讨论】:

  • 你可以使用instanceof,但这颠覆了OOP原则。你想做什么?
  • 我怎么知道哪个是奥迪,哪个是西雅特”你为什么还要这样做?你的Car 班级不是已经有你需要的所有方法了吗?
  • @AdrianLeonhard,我正在尝试从汽车列表中获取特定汽车的数据。我正在从另一个地方收到该列表,需要对其进行处理。
  • @Pshemo,没有。每辆特定的汽车都有一些额外的变量,包括它的 getter 和 setter。
  • 好的,在这种情况下,instanceof 是您正在寻找的运营商。但我仍然对Seat 可能有哪些Audi 或其他汽车不应该有的数据感兴趣。

标签: java


【解决方案1】:

您可以在投射前使用instanceof。例如:

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

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

【讨论】:

    【解决方案2】:

    你可以使用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?

    【讨论】:

      【解决方案3】:

      用instanceof检查,例如:

      car instanceof Audi
      

      如果变量 car 是 Audi 的实例,则返回 true,否则返回 false。

      【讨论】:

        【解决方案4】:

        无论是否明显,这都能解决问题:

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

        【讨论】:

          猜你喜欢
          • 2019-01-08
          • 2016-07-07
          • 2013-05-17
          • 1970-01-01
          • 2021-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多