首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8接口/类加载器更改?

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

Stack Overflow用户
提问于 2014-11-07 11:05:53
回答 2查看 1.3K关注 0票数 4

我发现在Java 1.7_51和1.8_20之间存在一些困难的谨慎。

初步情况:

一个接口:

代码语言:javascript
复制
interface InterfaceA {
    public void doSomething();
}

两个班:

代码语言:javascript
复制
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文件。

有人能解释一下吗?

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

EN

回答 2

Stack Overflow用户

发布于 2014-11-07 12:49:43

形式化规范描述了寻找调用表达式的目标方法的过程,首先搜索所有适用的方法,然后选择最具体的方法,如果不存在歧义,则成功。

比较JLS 15.12.2.1。确定可能适用的方法

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2014-11-07 11:47:27

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

  1. 可能在Java 8中添加默认方法、类型注释或其他内容意味着需要更改编译器,以加载间接引用接口的类文件。
  2. 也许这只是编译器其他一些重组的一个无害的副作用。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26799874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档