【发布时间】:2019-01-15 22:03:00
【问题描述】:
试图理解从类到接口的java缩小转换。 JLS(JLS-5.1.6) 声明:
从任何类类型 C 到任何非参数化接口类型 K,前提是 C 不是 final 且不实现 K。
为了测试这一点,我创建了一个类和一个接口。然后尝试将类转换为接口,但得到一个运行时 ClassCastException。这是我的代码示例。
class NarrowingReferenceConversion
{
public static void main(String args[])
{
S s = new S();
T t = (T)s;
}
}
interface T
{
public void print();
}
class S
{
public void print(){
System.out.println("S.print()");
}
}
在编译和运行上述代码时,我收到以下错误消息:
线程“main”java.lang.ClassCastException 中的异常:S 不能转换为 T
【问题讨论】:
-
你的类 S 应该实现接口 T。在这种情况下,转换会成功。
-
在5.1.6的末尾有:"这样的转换需要在运行时进行测试,以确定实际的引用值是否是新类型的合法值。如果不是,那么一个ClassCastException被抛出。"
标签: java casting type-narrowing