想象一下,我们有C类实现接口I和J声明为;
I i = new C();
为什么这3个不会出错(特别是最后一个):
1) C c = (C)i;
2) J j = (J)i;
3) i = (I)null;
提前谢谢。
答案 0 :(得分:1)
C c = (C)i;
由于i
可以包含C
类型的实例,因此允许编译器将I
转换为C
类型引用没有问题(如果转换将在运行时成功,我们将请确保实例支持C
引用中的所有方法,该实例也属于C
类型或其子类型。
J j = (J)i;
由于有可能(如我们的情况)存储在i
中的实例也将实现J
接口编译器允许我们在不相关接口的引用之间进行转换。但是,如果存储在i
中的实例不会实现J
,那么我们将在运行时获得ClassCastException
。
i = (I)null;
好吧,null
可以分配给任何引用,因此允许将其分配给i
或投射它没有问题。
答案 1 :(得分:0)
第一个起作用,因为我是C的一个实例(即使引用是类型I,但是对于转换,引用类型是无关紧要的。)
第二个工作,因为我是C的实例,因此也是J的一个实例(因为C实现了J)。引用类型与转换无关。
答案 2 :(得分:0)
接口是一个不同的视图"从对象。当你调试它时,总会有" C"宾语。
对于Null你可以看一下: No Exception while type casting with a null in java
答案 3 :(得分:0)
可以使用,因为 i 是 I 的引用变量,但它包含 C 的实例。如果对象是您要投射到的类的实例,则允许您向下转换对象。
C 实现 J ,您始终可以转发对象。
我想这是因为 i 是一个引用变量,允许它具有空值,并且你给它一个值为null。
答案 4 :(得分:0)
创建对象并使用语句将其分配给i后。
I i = new C();
即使引用它的变量定义为I,该对象仍然是C。
SO
C c = (C)i;
只是将同一个对象分配给一个定义为C的新变量。由于该对象属于C类,所以没有问题。
j = (J)i;
只是将同一个对象分配给一个定义为J的新变量。由于该对象是C类,它实现了接口J,它也是J类型所以没有问题。
i = (I)null;
只需将变量i设置为null。