Java 8接口/类加载器更改?

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

我发现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 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文件。 但我知道我没有收到任何错误信息

有人能给我解释一下吗


。。对不起,我的英语不好。

我可以想出两种可能的解释:

  • 可能Java 8中添加了默认方法、类型注释或其他内容,这意味着需要更改编译器以加载间接引用接口的类文件

  • 也许这只是编译器的一些其他重构的无害副作用


  • 无论哪种方式,它都不一定对运行时发生的事情有任何影响。编译时的“修复”是不删除这样的接口类文件。

    正式规范描述了查找调用表达式的目标方法的过程,即首先搜索所有适用的方法,然后选择最具体的方法,如果没有歧义,则会成功

    比较

    在编译时步骤1(§15.12.1)确定的类或接口中搜索可能适用于此方法调用的所有成员方法;从超类和超级接口继承的成员包括在此搜索中

    在您的情况下,可以推断在
    ClassA
    中找到的方法与编译器在
    InterfaceA
    中找不到更具体方法的方法完全匹配,但是,规范并不要求编译器必须在这一点停止,从而缩短搜索。这是一个编译器可能具有的优化,但是实现搜索就像正式指定的那样,即首先搜索整个类型层次结构,然后选择,是合适的


    考虑到Java 8的所有新功能和类型推断的过程是多么微妙和复杂,可以理解,当前的实现更为保守,而不是优化。

    通常,该类将通过RMI重新加载