一个具体类到接口的具体类,JVM是否仍然认为它是具体类的实例?
答案 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将知道实例指向实现。