【发布时间】:2017-02-08 12:51:00
【问题描述】:
以下代码使用 javac 和 Eclipse 4.6.1/4.6 编译,但在 Eclipse 4.6.2 中产生错误:
package ecbug;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Foo
{
class A
{
public int getStart() { return 0; }
}
void someMethod(List<A> toRemove)
{
Collections.sort(toRemove, Comparator.comparing(t -> -t.getStart()));
}
}
Eclipse 4.6.2 在-t.getStart() 下抱怨类型不匹配:无法从 int 转换为 Comparable>.
我认为Comparator.comparing(...) 的参数应该是Comparable<T> 和T = A,函数方法compareTo 返回int。 Eclipse 似乎认为 lambda 函数应该返回 Comparable>。
我强烈怀疑一个 Eclipse 错误,但肯定有 Eclipse 正确实现了语言规范而 javac 没有的情况,所以似乎值得一问:这是一个 Eclipse 错误还是 javac 错误?那里有任何语言律师可以指出语言规范的相关部分吗?
可能相关的问题,在我看来不是重复的:
Java 8 Stream flatMap and group by code compiler error - 类似的错误信息,但不清楚是否是完全相同的问题; Answer 声称这是一个 Eclipse 错误,但没有提供错误链接或 JLS 引用;指的是旧的 Eclipse 版本。
Why didn't this java 8 example using type inference compile in Eclipse? - 与上一个类似
Java Stream collect after flatMap returns List<Object> instead of List<String> - 再次,可能是一个不同的问题; cmets 声称存在 Eclipse 问题,但没有通过引用 JLS 来证明其合理性,也没有提供指向 Eclipse 错误报告的链接。
【问题讨论】:
-
在过去的几年里,我看到过几个这样的问题。您是否进行了彻底的搜索?
-
@T.J.Crowder 很难为如此具体的内容找到正确的搜索词,但我确实搜索了一段时间,是的。有些问题可能会显示相关错误(例如stackoverflow.com/questions/25853988/…),但我找不到任何与语言规范相关的问题,这就是我在这里所要求的。
-
对我来说编译没有错误(Eclipse 4.6)
-
@ThomasFritsch 实际上,它似乎随着最新的 Eclipse JDT 发生了变化:版本 3.12.2.v20161124-1400 - 这是 4.6.2 更新的一部分(4.6.1 和 4.6 编译代码成功地)。不过,根据语言规范,哪种行为是正确的仍然是一个悬而未决的问题。
-
我已经提交了一个 Eclipse 错误 - bugs.eclipse.org/bugs/show_bug.cgi?id=511924 - 看看开发人员怎么说。
标签: java eclipse lambda language-lawyer