Concrete Class实现了一个接口。接下来的Typecasted接口。 JVM如何识别Typecasted实例?

时间:2011-01-16 00:40:22

标签: java interface casting concreteclass

一个具体类到接口的具体类,JVM是否仍然认为它是具体类的实例?

2 个答案:

答案 0 :(得分:1)

在回答具体问题之前,请注意接口的实现可以在接受接口类型的任何地方传递。即如果Impl实现了Interface,那么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");
        }
    }
}

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

另外,请注意我的代码回答了问题,它做了很多错误 - 你不会在专业设置中看到这样的代码(或者你不应该至少)。接口的关键是您可以定义行为,只需传入符合该行为的对象。所以你不会编写一个接受实现的方法,你会编写一个接受接口的方法,你可以传递任何提供实现的东西。这样,您可以将不同的实现传递给可能出现的相同方法。

答案 1 :(得分:1)

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