【发布时间】:2017-02-09 16:44:12
【问题描述】:
我相信我在这里遇到了一个 Eclipse 错误,但我想确认一下。
我使用的是java 8(jdk 1.8.0_102),我的代码编译正常,但是eclipse给了我一个错误。
我的代码如下所示:
public ListenableFuture<ProtoBufExchange> myMethod(
//some code here
return Futures.transform(future,(Request.Builder reqBuilder) -> {
//some code here
return Futures.immediateFuture(exchange);
}
eclipse中显示的错误是这样的:
方法transform(ListenableFuture
, AsyncFunction super Request.Builder,? extends ProtoBufExchange>) 对于 Futures 类型是不明确的。
如果我放一个演员,eclipse不会抱怨:
public ListenableFuture<ProtoBufExchange> myMethod(
//some code here
return Futures.transform(future,(AsyncFunction<Request.Builder, ProtoBufExchange>) (Request.Builder reqBuilder) -> {
//some code here
return Futures.immediateFuture(exchange);
}
我知道 guava 15.0 Future.transform() 已重载,有以下两种形式(在较新的 guava 版本上,异步方法具有不同的名称):
transform(ListenableFuture<I> input, Function<? super I,? extends O> function)
或
transform(ListenableFuture<I> input, AsyncFunction<? super I,? extends O> function)
但是 jdk 编译器以某种方式解决了这种歧义。可能是因为在上面的代码中,如果我们实现的是 Function 而不是 AsyncFunction,Futures.transform 的返回类型将与方法返回类型不匹配。
这是 Eclipse 的错误吗?我在这里错过了什么吗?
关于我的环境的更多详细信息:
jdk:1.8.0_102
日食:4.6.2
番石榴:15.0
【问题讨论】:
-
eclipse 是否使用与在 eclipse 之外运行程序相同的
java设置? -
@CKing Eclipse 拥有自己的 Java 编译器 (ecj),因此可以从 Eclipse 和 javac 获得不同的结果。
-
@greg-449 我明白了。我以前没有遇到过这样的情况,所以不知道。
-
可以说,重载方法
transform(A->B)和transform(A->F<B>)天生就可以消除歧义,尤其是在提供隐式 Lamba 作为参数时。抛开语言规范不谈,程序员很难对其进行推理并理解选择了哪种方法。在 Java 中,API 设计者不应该创建这样的重载方法。当然,公平地说,这个 guava API 是在 Java 8 规范最终确定之前设计的。这种情况很像map和flatMap——最好使用2个不同的方法名。
标签: java eclipse lambda java-8 overloading