假设我有一个接口Vehicle
和一个实现Car
。类Car
有一个名为getNumberCylinders()
的方法,它不属于Vehicle
接口。因此,在我的代码中,我需要将Vehicle
实例强制转换为类Car
,以便调用此方法。
这样的演员是否会产生性能开销,而不是将此方法包含在接口中并直接调用该方法而不进行强制转换?
答案 0 :(得分:1)
这样的演员是否会产生性能开销,而不是将此方法包含在接口中并直接调用该方法而不进行强制转换?
在这种情况下,是的,因为该对象可能不是Car,因此Java必须进行运行时检查,这就是抛出ClassCastExceptions的方式。 JVM规范#2.6.8。
如果你必须这样做,你通常会在设计阶段做错事。我会重新考虑你的对象模型。
答案 1 :(得分:0)
如果您认为所有车辆都应具有'气缸数',那么最好将该方法添加到车辆界面。否则,铸造完全没问题。在运行时,强制转换根本不会修改您的对象。 Casting更多地与编译检查有关。 虽然Java规范本身并不保证它将是0纳秒操作,但是由于转换操作没有明显的性能开销报告。 在我的应用程序中,我会更多地担心不必要的数据库命中和对象创建,而不仅仅是输入类型。