Java接口转换

时间:2015-05-24 10:50:54

标签: java interface casting

想象一下,我们有C类实现接口I和J声明为;

I i = new C();

为什么这3个不会出错(特别是最后一个):

1) C c = (C)i;
2) J j = (J)i;
3) i   = (I)null;
提前谢谢。

5 个答案:

答案 0 :(得分:1)

  1. C c = (C)i;

    由于i可以包含C类型的实例,因此允许编译器将I转换为C类型引用没有问题(如果转换将在运行时成功,我们将请确保实例支持C引用中的所有方法,该实例也属于C类型或其子类型。

  2. J j = (J)i;

    由于有可能(如我们的情况)存储在i中的实例也将实现J接口编译器允许我们在不相关接口的引用之间进行转换。但是,如果存储在i中的实例不会实现J,那么我们将在运行时获得ClassCastException

  3. 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)

  1. 可以使用,因为 i I 的引用变量,但它包含 C 的实例。如果对象是您要投射到的类的实例,则允许您向下转换对象。

  2. C 实现 J ,您始终可以转发对象。

  3. 我想这是因为 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。