我正在使用 ajc 1.8、java 8 并遇到编译器问题。这是示例代码。
public class ExecutorTests {
List<Runnable> tasks = Arrays.asList(
() -> {
System.out.println("task1 start");
try {
Thread.sleep(1000);
} catch (Exception ignored) {}
System.out.println("task1 end");
},
() -> {
System.out.println("task2 start");
try {
Thread.sleep(1000);
} catch (Exception ignored) {}
System.out.println("task2 end");
},
() -> {
System.out.println("task3 start");
try {
Thread.sleep(1000);
} catch (Exception ignored) {}
System.out.println("task3 end");
}
);
@Test
public void executeInSync(){
tasks.stream().forEach(Runnable::run);
}
}
此代码可以使用 javac 正确编译并执行,同时 ajc 失败并显示以下内容:
如果我用匿名类替换 lambda,这将编译并运行,但我想找到不强制我返回匿名类、任何 vm 参数或任何其他解决方法的解决方法?
我最近使用 ajc 的 java 8 代码编译问题已使用 -noverify 标志解决。
也许我可以使用加载时编织来解决所有问题?
最佳答案
显然target typing/type inference在这里不起作用(我还不知道为什么),尽管您声明 List<Runnable>
结果,泛型类型 Arrays.asList
无法弄清楚您想要实现哪个功能接口(interface)。
我不确定这是否有效,但您可以设置通用类型 asList
方法Runnable
手动。只需编写即可做到这一点
List<Runnable> tasks = Arrays.<Runnable>asList(
... // ^^^^^^^^^^ you need to add this
);
关于java - ajc 不会将 lambda 编译为 vararg 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122672/