【问题标题】:ajc wont compile lambda as an vararg argumentajc 不会将 lambda 编译为 vararg 参数
【发布时间】:2014-06-09 23:25:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一种解决方法可能是将 lambda 表达式提取到它们自己的 Runnable 变量中,然后将变量添加到列表而不是直接添加 lambda。

标签: java lambda aspectj java-8


【解决方案1】:

显然target typing/type inference 在这里不起作用(我还不知道为什么),尽管您声明了List&lt;Runnable&gt; 作为结果,但泛型类型Arrays.asList 无法确定哪个要实现的功能接口。

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

List<Runnable> tasks = Arrays.<Runnable>asList(
   ...                     // ^^^^^^^^^^ you need to add this
);

【讨论】:

  • 这行得通,谢谢,但无论如何我认为这应该适用于 ajc(因为它可以用 javac 正确编译,开发人员不应该费心将代码用于 ajc 编译器)......也许值得打开错误跟踪器上的错误?
  • 如果 ajc 使用标准编译器,那确实很奇怪。也许它使用了自己的编译器,比如 Eclipse(Eclipse 还抱怨如果没有明确地将 &lt;Runnable&gt; 放在那里就无法编译 Arrays.asList)。
  • ajc 确实使用了 eclipse 编译器。
  • 我提出了 eclipse 问题bugs.eclipse.org/bugs/show_bug.cgi?id=437007 来解决这个问题(Eclipse Luna RC3 仍然存在问题)。一旦他们修复它,当我在该固定版本的 JDT 上重新定位 AspectJ 时,我将获得修复。
  • 所以,当我在 IDEA 中将它用作单独的 aspectJ 编译器时,ajc 仍然会出现这样的错误。有任何想法吗? (我使用 lib AspectJ1.8.7)
猜你喜欢
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 2014-10-28
  • 2021-01-30
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多