我使用的是AJC1.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参数或任何其他解决方案?
我最近的java 8代码编译问题是用-noverify标志解决的。
也许我会用加载时间编织来解决所有的问题?
发布于 2014-06-09 15:19:44
显然,目标分型/类型推理在这里没有工作(我还不知道为什么),尽管结果声明了List<Runnable>,但泛型Arrays.asList无法确定要实现哪个功能接口。
我不确定这是否有效,但您可以手动将asList方法的泛型类型设置为Runnable。要做到这一点,只需写
List<Runnable> tasks = Arrays.<Runnable>asList(
... // ^^^^^^^^^^ you need to add this
);https://stackoverflow.com/questions/24122672
复制相似问题