【问题标题】:Concrete Class implements a interface. Typecasted to Interface later. How does JVM recognize the Typecasted instance?具体类实现了一个接口。稍后类型转换为接口。 JVM 如何识别 Typecast 实例?
【发布时间】:2011-01-16 00:40:22
【问题描述】:

类型转换为接口的具体类,JVM是否仍然认为它是具体类的实例?

【问题讨论】:

    标签: java interface casting concreteclass


    【解决方案1】:

    当您创建分配时,分配的类型是根据给定的类型推断出来的。例如。 MyInterface mi = new MyImplementation();在这种情况下,mi 被键入为接口,但指的是实现。如果您执行实例化,JVM 将知道该实例指向一个实现。

    【讨论】:

      【解决方案2】:

      在我回答具体问题之前,请注意接口的实现可以在任何接受接口类型的地方传递。即如果 Impl 实现了接口,则 Impl 是一个接口,那么为什么要转换为接口类型呢?这将是完全没有必要的。我见过你会转换到特定实现而不是从实现到接口的情况,即使这些情况也是冒险的。

      我必须用下面的代码来验证这一点,但是不,如果你有一个接口实现,并且你将它转换为接口,如果你尝试作为接口传递,任何需要实现的东西都会得到一个编译时错误.这是代码

      public class Runner {
      
          public static void main(String[] args) {
      
              ExampleImpl impl = new ExampleImpl(); // never do this in real life
              // Example impl = new ExampleImpl() <-- do this instead "code to the interface"
              Example casted = (Example) impl;
      
              takesExampleImpl(casted); // compile error because takesImpl expects the implementation
              takesExampleImpl(impl); // works because impl is an implementation
              takesExampleImpl((ExampleImpl)casted); // works because I cast it back to imple
      
          }
      
          public static void takesExampleImpl(ExampleImpl instance){
      
          }
      
          static class ExampleImpl implements Example {
      
              public void testMethod() {
                  System.out.println("impl");
              }
          }
      }
      

      示例只是一个简单的接口,只有一种方法,代码没有显示。

      另外,请注意,我的代码回答了这个问题,它做错了很多事情——在专业环境中你不会看到这样的代码(或者至少你不应该看到)。接口的意义在于您可以定义行为,并且只需传入符合该行为的对象。所以你不会写一个接受实现的方法,你会写一个接受接口的方法,你可以将任何提供实现的东西传递给它。这样,您可以根据需要将不同的实现传递给相同的方法。

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2017-02-16
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 2021-12-25
        • 1970-01-01
        相关资源
        最近更新 更多