当我们将一种类型的对象转换为另一种类型时,是否有任何开销?或者编译器只是解决所有问题而在运行时没有成本?
这是一般的事情,还是有不同的情况?
例如,假设我们有一个 Object[] 数组,其中每个元素可能有不同的类型。但是我们总是很确定,比如说,元素 0 是一个 Double,元素 1 是一个字符串。(我知道这是一个错误的设计,但让我们假设我必须这样做。)
Java 的类型信息在运行时是否仍然保留?或者在编译后一切都被遗忘了,如果我们做 (Double)elements[0],我们只会跟随指针并将这 8 个字节解释为双精度值,不管是什么?
我不太清楚 Java 中的类型是如何完成的。如果您对书籍或文章有任何推荐,也谢谢。
有两种类型的铸造:
隐式转换,当您从一个类型转换为更宽的类型时,这是自动完成的并且没有开销:
String s = "Cast"; Object o = s; // implicit casting
显式转换,当您从较宽的类型转换为较窄的类型时。对于这种情况,您必须像这样显式使用强制转换:
Object o = someObject; String s = (String) o; // explicit casting
在第二种情况下,运行时存在开销,因为必须检查这两种类型,并且在强制转换不可行的情况下,JVM 必须抛出 ClassCastException。
摘自JavaWorld:铸造成本