Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ajc不会将lambda编译为vararg参数_Java_Lambda_Aspectj_Java 8 - Fatal编程技术网

Java ajc不会将lambda编译为vararg参数

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);

我正在使用AJC1.8、Java8,并且遇到了编译器问题。下面是示例代码

 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)