java - ajc 不会将 lambda 编译为 vararg 参数

标签 java lambda aspectj java-8

我正在使用 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 失败并显示以下内容:

enter image description here

如果我用匿名类替换 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/

相关文章:

java - 我可以尝试放置两个 Select 吗?

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?

python - 使用 lambda 函数和标量的字典理解

java - 避免 AOP 中重叠的切入点和切面

java - spring如何从方法中获取args名称

javascript - 在 ajax get-method Javascript 中发送对象

java - 更改圆弧半径

java - java中有没有模拟http请求的工具

java - 在 Java 8 中是否有更简洁的方法来执行此操作 - map 操作

java - 使用方法注释值来定位切入点