首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ajc不会将lambda编译为vararg参数。

ajc不会将lambda编译为vararg参数。
EN

Stack Overflow用户
提问于 2014-06-09 14:40:36
回答 1查看 436关注 0票数 2

我使用的是AJC1.8,java 8,并遇到编译器问题。这是示例代码。

代码语言:javascript
复制
 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标志解决的。

也许我会用加载时间编织来解决所有的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-09 15:19:44

显然,目标分型/类型推理在这里没有工作(我还不知道为什么),尽管结果声明了List<Runnable>,但泛型Arrays.asList无法确定要实现哪个功能接口。

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

代码语言:javascript
复制
List<Runnable> tasks = Arrays.<Runnable>asList(
   ...                     // ^^^^^^^^^^ you need to add this
);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24122672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档