ajc不会将lambda编译为vararg参数

时间:2014-06-09 14:40:37

标签: 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

如果我用匿名类替换lambdas,这将编译并运行,但是我想找到一种解决方法,它不会强迫我回到匿名类,任何vm参数或任何其他解决方法?

我最近使用-noverify标志解决了带有ajc的java 8代码编译问题。

也许我会使用加载时间编织摆脱所有问题?

1 个答案:

答案 0 :(得分:3)

显然target typing / type inference在这里没有工作(我不知道为什么),尽管您声明List<Runnable>为结果,但是通用类型{{1无法确定您要实现的功能接口。

我不确定这是否有效,但您可以手动将Arrays.asList方法的泛型类型设置为asList。要做到这一点只需写

Runnable