取自http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
5.1.6。 缩小参考转化次数六种转化称为缩小参考转化次数:来自任何参考类型S 任何参考类型T,只要S是T 的适当超类型
public class S {}
public class T extends S {}
如下所示抛出java.lang.ClassCastException
S s = new S();
T t = (T)s;
“转换”是否只是指以下 compiles 不会引发运行时异常。
S s = null;
T t = (T)s;
执行此转换的原因是什么?
答案 0 :(得分:1)
在你引用的document中,它说明了
此类转换需要在运行时进行测试以确定是否存在 实际参考值是新类型的合法值。如果不, 然后抛出
ClassCastException
。
转换也适用于您的第一个示例。类型S
的值不是类型T
的合法值。 The value null
is a legitimate value of type T
.
始终可以为任何引用分配或转换null引用 类型(§5.2,§5.3,§5.5)。
编译器相信您知道自己在做什么。 JVM没有。
缩小参考转换通常称为向下转换。它通常用于你有一些超类型的引用但想要根据它们的实际类型做更具体的事情。
Object superTypeReference = // something;
if (superTypeReference instanceof List) {
List<?> subtypeReference = (List<?>) superTypeReference;
subtypeReference.clear();
}
答案 1 :(得分:1)
虽然在Sotirios Delimanolis的例子(// something
)中隐含着,但我想补充一点并明确表示如果你有:
public class S {}
public class T extends S {}
然后,JLS中的缩小转换不仅仅是指null
的示例,而是指:
S s = new T();
T t = (T) s; // compiles and won't give a ClassCastException
正如你提到的那样
S s = new S();
T t = (T) s;
将编译但会抛出ClassCastException