为什么我会根据java导入和静态导入序列顺序获得不同的编译结果?

时间:2016-11-05 16:38:00

标签: java compilation compiler-errors

我遇到了编译问题,但无法理解为什么会出现这种问题。 实际上花了很多时间来理解原因在哪里(在“废话”项目中远非明显),但在重现该错误之后,我大大简化了所有代码,特别为您展示了一个小例子:

包结构:

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
        }
    }
}

我在Main类中遇到了编译错误:

错误:(15,39)java:找不到符号   符号:类制造商   location:class 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 Compiler的正常行为是什么?如果是这样,我想清楚地理解它为什么会发生。

使用java版本1.8.0_112和1.7.0_80(MacOS)测试

P.S。

2 个答案:

答案 0 :(得分:2)

检查一下:

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

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

因此,当您更改导入顺序时,不会发生此问题,因为当编译器读取静态导入并跳转以处理内部类因为这些导入在内部类中使用时,编译器很高兴,因为它已导入非静态Maker界面。

这意味着要急切地评估进口。

我希望这会有所帮助。

答案 1 :(得分:0)

另请参阅 Java how import order matters when import class/enum inner an inner class 以了解此问题也存在于非静态导入中。