我发现在Java 1.7_51和1.8_20之间存在一些困难的谨慎。
初步情况:
一个接口:
interface InterfaceA {
public void doSomething();
}两个班:
public class ClassA implements InterfaceA {
public void doSomething() {
System.out.println("Hello World!");
}
}
public class ClassB {
public static void main(String[] args) {
ClassA a = new ClassA();
a.doSomething();
}
}接下来,我用(Java1.8) -> javac *.java编译了类,编译器完成后,我删除了InterfaceA.java和InterfaceA.class文件。现在,我再次尝试只编译ClassB.java,并得到了错误消息:
ClassB.java:4:错误:无法访问InterfaceA a.doSomething(); InterfaceA未找到1错误的类文件
和我用java 1.7试过的一样。编译完成后,-> javac *.java删除了InterfaceA.java和InterfaceA.class文件。
有人能解释一下吗?
。。对不起我的英语不好..。
发布于 2014-11-07 12:49:43
形式化规范描述了寻找调用表达式的目标方法的过程,首先搜索所有适用的方法,然后选择最具体的方法,如果不存在歧义,则成功。
比较JLS 15.12.2.1。确定可能适用的方法
由编译时步骤1 (§15.12.1)确定的类或接口被搜索到可能适用于此方法调用的所有成员方法;从超类和超接口继承的成员包括在此搜索中。
在您的例子中,可以推断在ClassA中找到的方法与编译器在InterfaceA中找不到更具体的方法是完全匹配的,然而,规范并没有要求编译器必须在此时停止,缩短搜索。这是编译器可能具有的优化,但实现搜索就像正式指定的一样,即先搜索整个类型层次结构,然后选择,这是合适的。
考虑到所有新的Java 8特性和类型推断,这个过程是多么微妙和复杂,可以理解的是,当前的实现更保守,而不是优化。
发布于 2014-11-07 11:47:27
我可以想到两种可能的解释:
无论哪种方式,它都不一定对运行时发生的事情产生任何影响。编译时的“修正”是不要像那样删除接口类文件。
https://stackoverflow.com/questions/26799874
复制相似问题