我有以下代码:
List<Move> moves = getMoves();
moves.sort(Comparator.comparingInt(Move::getScore).reversed());
作为Move
中的方法定义:
public int getScore() { return myScore; }
然而我重载了getScore()
:
public int getScore(boolean doubleIt) { return myScore*2; }
现在上面的comparingInt()
方法会抱怨,除非我这样做:
Comparator.<Move>comparingInt(Move::getScore).reversed()
有人解释为什么编译器在引用重载方法时需要额外的<Move>
吗?
错误信息是:
incompatible types: cannot infer type-variable(s) T
(argument mismatch; invalid method reference
incompatible types: java.lang.Object cannot be converted to boolean)
这是在MacOS Sierra上,JDK是:
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
答案 0 :(得分:0)
您引入了通用歧义,编译器要求您明确说明要与此块静态链接的方法。函数表示法允许隐式传递参数,但是如果不指定类,编译器不知道要绑定的两个有效方法中的哪一个。由于这不是多态问题,因此它将在编译时受到约束,并且编译器需要使用明确的指令。