Java 8接口/类加载器更改?
我发现Java1.7_51和Java1.8_20之间存在一些困难 最初的情况是: 一个接口:Java 8接口/类加载器更改?,java,compiler-errors,java-8,java-7,Java,Compiler Errors,Java 8,Java 7,我发现Java1.7_51和Java1.8_20之间存在一些困难 最初的情况是: 一个接口: interface InterfaceA { public void doSomething(); } 两类: public class ClassA implements InterfaceA { public void doSomething() { System.out.println("Hello World!"); } } public class
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编译了这些类
编译器完成后,我删除了interfaceea.java和interfaceea.class文件。
现在我再次尝试仅编译ClassB.java,并得到错误消息:
java:4:错误:无法访问InterfaceA
a、 doSomething()找不到InterfaceA的类文件 1错误 与我在java 1.7中尝试的相同..->javac*.java 编译器完成后,我删除了interfaceea.java和interfaceea.class文件。 但我知道我没有收到任何错误信息 有人能给我解释一下吗
。。对不起,我的英语不好。我可以想出两种可能的解释:
无论哪种方式,它都不一定对运行时发生的事情有任何影响。编译时的“修复”是不删除这样的接口类文件。正式规范描述了查找调用表达式的目标方法的过程,即首先搜索所有适用的方法,然后选择最具体的方法,如果没有歧义,则会成功 比较 在编译时步骤1(§15.12.1)确定的类或接口中搜索可能适用于此方法调用的所有成员方法;从超类和超级接口继承的成员包括在此搜索中 在您的情况下,可以推断在
ClassA
中找到的方法与编译器在InterfaceA
中找不到更具体方法的方法完全匹配,但是,规范并不要求编译器必须在这一点停止,从而缩短搜索。这是一个编译器可能具有的优化,但是实现搜索就像正式指定的那样,即首先搜索整个类型层次结构,然后选择,是合适的
考虑到Java 8的所有新功能和类型推断的过程是多么微妙和复杂,可以理解,当前的实现更为保守,而不是优化。通常,该类将通过RMI重新加载