gpt4 book ai didi

java - 泛型和 lambdas - javac 和 Eclipse 编译器中的不同行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:30 26 4
gpt4 key购买 nike

注意:我发现多个问题指出 javac 之间的差异和 Eclipse 编译器,但据我所知,他们都在讨论其他问题。

假设我们有这个方法:

public static <T, U> void foo(Supplier<T> a, Function<T, U> b, Consumer<U> c)
{
c.accept(b.apply(a.get()));
}

我发现 javac 之间有不同的行为和 Eclipse Java 编译器在编译对此方法的调用时,我不确定两者中哪一个是正确的。


此方法的一个简单用法是:

// variant 1
foo(
() -> Optional.of("foo"),
value -> value.get(),
value -> System.out.println(value));

编译器应该能够绑定(bind) TOptional<String>使用第一个参数和 UString使用第二个。所以这个调用应该是有效的(在我看来)。

使用 javac 可以很好地编译但无法使用 Eclipse 进行编译:

Type mismatch: cannot convert from void to <unknown>

将类型参数添加到第一个参数 ( () -> Optional.<String> of("foo") ) 使其也可以在 Eclipse 中编译。

问题:从规范的角度来看,Eclipse 拒绝此调用是否正确(以及为什么(不))?


现在假设我们想抛出一个自定义(运行时)异常,如果 Optional是空的:

// variant 2
foo(
() -> Optional.of("foo"),
value -> value.orElseThrow(() -> new RuntimeException()),
value -> System.out.println(value));

这被双方拒绝,javac和 Eclipse 编译器,但有不同的错误消息:

  • javac : "未报告的异常 X;必须被捕获或声明为抛出"
  • Eclipse 编译器:“类型不匹配:无法从 void 转换为

当我如上所述将类型参数添加到第一个参数时,Eclipse 编译成功,同时 javac仍然失败。当我添加 <RuntimeException>作为第二个参数的类型参数,它是相反的,Eclipse 失败并且 javac成功。

问题:同样,编译器拒绝这个调用是否正确,为什么?


在我看来,这两种变体都可以通过使用类型参数在没有额外提示的情况下编译得很好。如果是这样,我将为 javac 填写一份错误报告(关于“未报告的异常”)和一个用于 Eclipse 编译器的(关于“类型不匹配”)。但首先我想确定规范与我的观点一致。

使用的版本:

  • javac : 1.8.0_66
  • eclipse JDT:3.11.1.v20151118-1100

编辑:

我填了bug 482781针对 Eclipse 中的问题。

javac 的问题已报告为 JDK-8056983 , 请参阅 Tunakis answer .

最佳答案

是的,你在各个方面都是对的。老实说,我无法链接到关于此的 JLS 的特定行:类型推断 is a whole chapter .

免责声明:我使用 Eclipse Mars 4.5.1 和 JDK 1.8.0_60 进行了测试。


变体 1 应该可以编译,而 Eclipse 在这里有一个错误。我在他们的 Bugzilla 中找不到与此相关的任何内容,因此您可以继续进行归档。如果将示例简化为这样,您可以确信它应该可以编译:

public static <T> void foo(Supplier<T> a) {
a.get();
}

foo(() -> Optional.of("foo"));

这在 Eclipse 和 javac 上都能很好地编译。添加参数确实(应该)不会更改编译期间为 T 推断的类型。


变体 2 不为 javac 编译,这确实是一个错误,如 JDK-8056983 中所报告的那样.编译器应该能够推断出 XRuntimeException。至于为什么 Eclipse 仍然无法编译它,同样,我在他们的 Bugzilla 中找不到任何东西,所以请随时报告!

关于java - 泛型和 lambdas - javac 和 Eclipse 编译器中的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com