【问题标题】:Java Interfaces CastingJava 接口转换
【发布时间】:2015-05-24 10:50:53
【问题描述】:

假设我们有一个实现接口 I 和 J 的类 C,声明为 ;

I i = new C();

为什么这3个不报错(尤其是最后一个):

1) C c = (C)i;
2) J j = (J)i;
3) i   = (I)null;

提前致谢。

【问题讨论】:

  • 可以发C签名吗?
  • @JordiCastilla 基于问题,我认为我们可以放心地假设它是class C implements I,J{}

标签: java interface casting


【解决方案1】:
  1. C c = (C)i;

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

  2. J j = (J)i;

    因为有可能(就像我们的例子一样)存储在i 中的实例也将实现J 接口编译器 允许我们在不相关接口的引用之间进行转换。但是如果存储在i 中的实例不会实现J,那么我们将在运行时得到ClassCastException

  3. i = (I)null;

    嗯,null 可以分配给 任何 引用,因此允许将其分配给 i 或强制转换没有问题。

【讨论】:

    【解决方案2】:

    第一个有效,因为 i 是 C 的一个实例(即使引用是类型 I,但对于强制转换,引用类型是无关紧要的)。

    第二个有效,因为 i 是 C 的一个实例,因此也是 J 的一个实例(因为 C 实现了 J)。引用类型与强制转换无关。

    【讨论】:

      【解决方案3】:

      接口是与对象不同的“视图”。当你调试它时,总是有“C”对象。

      对于 Null,您可以在这里查看: No Exception while type casting with a null in java

      【讨论】:

        【解决方案4】:
        1. 之所以有效,是因为 iI 的引用变量,但它包含 C 的实例。如果对象是您要转换的类的实例,您可以向下转换该对象。

        2. C 实现 J 并且您始终可以向上转换对象。

        3. 我猜是因为 i 是一个引用变量,它可以有一个空值,而你给它一个空值。

        【讨论】:

          【解决方案5】:

          一旦您创建了对象并使用语句将其分配给 i。

              I i = new C();
          

          尽管引用它的变量定义为 I,但该对象仍然是 C。

          所以

              C c = (C)i;
          

          只需将同一个对象分配给定义为 C 的新变量即可。由于该对象是 C 类型,因此没有问题。

              j = (J)i;
          

          只需将同一个对象分配给定义为 J 的新变量。由于该对象是实现接口 J 的 C 类型,因此它也是 J 类型,所以没有问题。

              i   = (I)null;
          

          只需将变量 i 设置为 null。

          【讨论】:

            猜你喜欢
            • 2014-05-03
            • 1970-01-01
            • 2011-12-14
            • 1970-01-01
            • 2013-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多