为什么我根据java的进口和静态导入序列为了得到不同的编译的结果?(Why do I get dif

2019-09-27 17:40发布

我面临着编译的问题,但不明白为什么它发生。 其实花了很多时间来了解其中的原因是(它是远离明显的“废话”项目),但重现这个错误我大大简化了所有的代码,尤其是显示一个小例子给你后:

包装结构:

com.company
|
----Main.class
|
----maker
    |
    ----Maker.class

Maker.class

package com.company.maker;

public interface Maker {
}

Main.class

package com.company;

import static com.company.Main.MakerImpl.Strategy.STRATEGY1;
import static com.company.Main.MakerImpl.Strategy.STRATEGY2;
import com.company.maker.Maker;

public class Main {

    public static void main(String[] args) {
        System.out.println(STRATEGY1.name() + STRATEGY2.name());
    }

    static class MakerImpl implements Maker {
        enum Strategy {
            STRATEGY1, STRATEGY2
        }
    }
}

和我在主类的编译错误:

错误:(15,39)的java:找不到符号符号:类设备位置:类com.company.Main

如果我改变从导入序列

import static com.company.Main.MakerImpl.Strategy.STRATEGY1;
import static com.company.Main.MakerImpl.Strategy.STRATEGY2;
->import com.company.maker.Maker;

->import com.company.maker.Maker;
import static com.company.Main.MakerImpl.Strategy.STRATEGY1;
import static com.company.Main.MakerImpl.Strategy.STRATEGY2;

然后它编译成功。

它是Java编译器的正常行为? 如果是的话我想清楚地了解为什么它会发生。

PS使用的Java版本1.8.0_112和1.7.0_80测试(MacOS的)

Answer 1:

检查:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6391197

看来,编译器看到的第一静态导入,然后跳转到照顾你的内部类的,而是因为它没有读过的最后一个非静态导入失败。

所以,当你改变进口秩序,不会发生此问题,因为当编译器读取静态导入和跳跃,因为这些进口中的内部类用来照顾内部类,编译器是幸福的,因为它已经导入非静态设备接口。

至极意味着进口热切评估。

我希望这有帮助。



文章来源: Why do I get different compilation result depending on java imports and static imports sequence order?