【问题标题】:Narrowing Reference Conversion缩小参考转换
【发布时间】:2015-07-05 23:02:21
【问题描述】:

取自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;

“转换”是否只是指编译不会引发运行时异常的以下内容。

S s = null;
T t = (T)s;

执行此转换的原因是什么?

【问题讨论】:

  • 有趣的是,他们甚至没有提到这一点如何缩小转换是完成的,但是您必须一直阅读到“铸造转换”才能最终发现'铸造上下文允许使用以下之一:[...] 缩小引用转换'。

标签: java type-conversion


【解决方案1】:

在您引用的document 中进一步说明

此类转换需要在运行时进行测试,以确定 实际参考值是新类型的合法值。如果不, 然后抛出ClassCastException

转换也适用于您的第一个示例。 S 类型的值不是T 类型的合法值。 The value null is a legitimate value of type T.

空引用始终可以分配或强制转换为任何引用 类型(§5.2、§5.3、§5.5)。

编译器相信您知道自己在做什么。 JVM 没有。

缩小参考转换通常称为向下转换。它通常用于您有某些超类型的引用但希望根据它们的实际类型对它们做更具体的事情的情况。

Object superTypeReference = // something;
if (superTypeReference instanceof List) {
    List<?> subtypeReference = (List<?>) superTypeReference;
    subtypeReference.clear();
}

【讨论】:

    【解决方案2】:

    虽然在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      相关资源
      最近更新 更多