以下是我偶然发现的一段代码的最小可验证示例。

package test_package;

import java.util.function.Predicate;

public class TestClass {

  public static final String CONST_STR = " some_data "+ getMoreData(e -> e.getId()==3);

  private static String getMoreData(Predicate<TestEnum> p){
    StringBuilder sb = new StringBuilder();
    for(TestEnum e : TestEnum.values()){
      if(p.test(e)){
        sb.append(e.name());
      }
    }
    return sb.toString();
  }

  public static void main(String[] args) {
    System.out.println(CONST_STR);
  }
}

enum TestEnum{
  OP1(1),OP2(2),OP3(3);

  private final int id;

  public int getId() {
    return id;
  }

  TestEnum(int id){
    this.id = id;
  }
}

当我尝试编译它时,它给了我



谁能指出我在哪里出问题了?

尝试编译javac test_package/TestClass.java时出现以下错误



我的版本是javac 1.8.0_112
谢谢您的期待!

最佳答案

It's bug,已在javac-9中修复。我尝试了最新的javac-9,但无法复制。

要解决这个问题,您可以执行以下操作:

public static final String CONST_STR;

static {
    CONST_STR = " some_data " + getMoreData(e -> e.getId() == 3);
}

似乎可以编译...

10-08 15:16