为什么Function.identity()会破坏类型设置,但t – > t不会?

在Java 8 lambdas,Function.identity()或t-> t中找到的答案似乎暗示Function.identity()几乎总是等于t -> t 。 但是,在下面看到的测试用例中,用Function.identity()替换t -> t导致编译器错误。 这是为什么?

 public class Testcase { public static  Collector comparatorOrdering( Function keyMapper, Function valueMapper, Comparator keyComparator, Comparator valueComparator) { return null; } public static void main(String[] args) { Map case1 = Stream.of(1, 2, 3). collect(comparatorOrdering(t -> t, t -> String.valueOf(t), Comparator.naturalOrder(), Comparator.naturalOrder())); Map case2 = Stream.of(1, 2, 3). collect(comparatorOrdering(Function.identity(), t -> String.valueOf(t), Comparator.naturalOrder(), Comparator.naturalOrder())); } } 

案例1编译得很好,但案例2失败了:

 method comparatorOrdering in class Testcase cannot be applied to given types; collect(comparatorOrdering(Function.identity(), t -> String.valueOf(t), required: Function,Function,Comparator,Comparator found: Function,(t)->Strin[...]Of(t),Comparator,Comparator reason: inferred type does not conform to upper bound(s) inferred: Object upper bound(s): Comparable,T#4,Object where T#1,A,R,K,V,T#2,T#3,T#4 are type-variables: T#1 extends Object declared in method comparatorOrdering(Function,Function,Comparator,Comparator) A extends Object declared in method comparatorOrdering(Function,Function,Comparator,Comparator) R extends Object declared in method comparatorOrdering(Function,Function,Comparator,Comparator) K extends Object declared in method comparatorOrdering(Function,Function,Comparator,Comparator) V extends Object declared in method comparatorOrdering(Function,Function,Comparator,Comparator) T#2 extends Comparable T#3 extends Comparable T#4 extends Comparable declared in method naturalOrder() 

我的环境是Windows 10,64位,Oracle JDK build 1.8.0_92-b14。

更新 :看到这个在ecj下编译,我有一个后续问题:这是javac的错误吗? JLS对此案有什么看法?

Ecj能够推断出正确的(?)类型参数(整数)以匹配约束。 Javac出于某种原因得出了不同的结果。

这不是javac / ecj第一次在类型参数的推断中表现不同。

在这种情况下,您可以使用函数。 identity()为javac提供一个提示,以使其可以使用javac进行编译。

对于Function.identity()和t-> t之间的区别:

  • Function.identity()是Function
  • t-> t在这种情况下是function<? 超级整数,? 扩展整数>

所以t-> t在它可以匹配的方法中更灵活。