【发布时间】:2011-01-16 00:40:22
【问题描述】:
类型转换为接口的具体类,JVM是否仍然认为它是具体类的实例?
【问题讨论】:
标签: java interface casting concreteclass
类型转换为接口的具体类,JVM是否仍然认为它是具体类的实例?
【问题讨论】:
标签: java interface casting concreteclass
当您创建分配时,分配的类型是根据给定的类型推断出来的。例如。 MyInterface mi = new MyImplementation();在这种情况下,mi 被键入为接口,但指的是实现。如果您执行实例化,JVM 将知道该实例指向一个实现。
【讨论】:
在我回答具体问题之前,请注意接口的实现可以在任何接受接口类型的地方传递。即如果 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");
}
}
}
示例只是一个简单的接口,只有一种方法,代码没有显示。
另外,请注意,我的代码回答了这个问题,它做错了很多事情——在专业环境中你不会看到这样的代码(或者至少你不应该看到)。接口的意义在于您可以定义行为,并且只需传入符合该行为的对象。所以你不会写一个接受实现的方法,你会写一个接受接口的方法,你可以将任何提供实现的东西传递给它。这样,您可以根据需要将不同的实现传递给相同的方法。
【讨论】: