0

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

4

2 回答 2

1

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

于 2011-01-16T01:26:07.153 回答
1

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

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

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");
        }
    }
}

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

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

于 2011-01-16T00:52:56.323 回答