Java 从接口转换到实现类的性能开销

Java 从接口转换到实现类的性能开销,java,performance,interface,casting,Java,Performance,Interface,Casting,假设我有一个接口Vehicle和实现Car。类Car有一个名为getnumbercylinds()的方法,该方法不是Vehicle接口的一部分。因此,在我的代码中,我需要将Vehicle实例转换为classCar,以便调用此方法 与将此方法包含到接口中并直接调用该方法而不使用此转换相比,这种转换是否会产生性能开销?如果您认为所有车辆都应该具有“气缸数”,那么最好将该方法添加到车辆接口中。否则,铸造是完全好的。在运行时,强制转换根本不会修改对象。强制转换更多地与编译检查有关。 由于强制转换操作,并

假设我有一个接口
Vehicle
和实现
Car
。类
Car
有一个名为
getnumbercylinds()
的方法,该方法不是
Vehicle
接口的一部分。因此,在我的代码中,我需要将
Vehicle
实例转换为class
Car
,以便调用此方法


与将此方法包含到接口中并直接调用该方法而不使用此转换相比,这种转换是否会产生性能开销?

如果您认为所有车辆都应该具有“气缸数”,那么最好将该方法添加到车辆接口中。否则,铸造是完全好的。在运行时,强制转换根本不会修改对象。强制转换更多地与编译检查有关。 由于强制转换操作,并没有明显的性能开销报告,尽管Java规范本身并不能保证它是0纳秒操作。 在我的应用程序中,我更担心不必要的数据库命中和对象创建,而不仅仅是类型转换

与将此方法包含到接口中并在没有强制转换的情况下直接调用该方法相比,这样的强制转换是否会产生性能开销

在本例中,是的,因为对象可能不是汽车,所以Java必须进行运行时检查,这就是ClassCastException如何抛出的。JVM规范#2.6.8


如果你不得不做这种事情,你通常在设计阶段就做错了。我会重新考虑您的对象模型。

在运行时强制转换没有任何作用。@DavidWallace所以强制转换将有0纳秒的性能命中率?如果
Vehicle
是一个接口,那么实际上就没有“
Vehicle
实例”这样的东西了。有一个类的实例实现了
Vehicle
@DavidWallace,这样JVM规范2.6.8要求的运行时检查就不会发生了?checkcast操作码不存在?这个例子有点奇怪,但问题是真实的。如果OP说“汽车有后备箱,摩托车没有”,而他们都是汽车,那就完全合理了。然而,我相信你对性能开销的看法是正确的,所以我支持投票。