Java ajc不会将lambda编译为vararg参数
我正在使用AJC1.8、Java8,并且遇到了编译器问题。下面是示例代码Java ajc不会将lambda编译为vararg参数,java,lambda,aspectj,java-8,Java,Lambda,Aspectj,Java 8,我正在使用AJC1.8、Java8,并且遇到了编译器问题。下面是示例代码 public class ExecutorTests { List<Runnable> tasks = Arrays.asList( () -> { System.out.println("task1 start"); try { Thread.sleep(1000);
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);
}
}
公共类测试{
List tasks=Arrays.asList(
() -> {
System.out.println(“task1启动”);
试一试{
睡眠(1000);
}捕获(忽略异常){}
System.out.println(“任务1结束”);
},
() -> {
System.out.println(“task2启动”);
试一试{
睡眠(1000);
}捕获(忽略异常){}
System.out.println(“任务2结束”);
},
() -> {
System.out.println(“task3启动”);
试一试{
睡眠(1000);
}捕获(忽略异常){}
System.out.println(“任务3结束”);
}
);
@试验
public void executeInSync(){
tasks.stream().forEach(Runnable::run);
}
}
此代码正确编译并使用javac执行,同时ajc出现以下故障:
如果我用匿名类替换lambdas,这将编译并运行,但我想找到一种解决方法,它不会强迫我回到匿名类、任何vm参数或任何其他解决方法
我最近的java 8代码编译问题和ajc代码编译问题是使用-noverify标志解决的
也许我可以使用加载时编织来解决所有问题?显然/在这里不起作用(我还不知道为什么),尽管您声明了List
,结果是泛型类型数组。asList
无法确定要实现哪个函数接口
我不确定这是否有效,但您可以手动将asList
方法的泛型类型设置为Runnable
。写下来就行了
List<Runnable> tasks = Arrays.<Runnable>asList(
... // ^^^^^^^^^^ you need to add this
);
List tasks=Arrays.asList(
…/^^^^^^^^^^您需要添加此
);
一种解决方法可能是将lambda表达式提取到它们自己的可运行的
变量中,然后将变量添加到列表中,而不是直接添加到lambda。这很有效,谢谢,但无论如何,我认为这应该适用于ajc(因为它可以用javac正确编译,开发人员不应该费心将代码应用到ajc编译器中)... 也许在bugtracker上打开bug是值得的?如果ajc使用的是标准编译器,这确实很奇怪。也许它正在使用自己的编译器,比如Eclipse(Eclipse也抱怨无法编译数组。asList
而不显式地将
放在那里)。ajc确实使用了Eclipse编译器。我提出了Eclipse问题来解决这个问题(Eclipse Luna RC3仍然存在问题)。一旦他们修复了它,当我在JDT的固定版本上重新设置AspectJ的基础时,我将立即修复。因此,当我在IDEA中将ajc用作单独的AspectJ编译器时,ajc仍然会给出这样一个错误。有什么想法吗?(我使用lib AspectJ1.8.7)