类型转换为接口的具体类,JVM 是否仍然认为它是具体类的实例?
问问题
2427 次
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 回答