对重载方法和泛型的引用

时间:2017-03-28 21:00:06

标签: java java-8

我有以下代码:

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)

示例代码:http://ideone.com/RxcXW6

1 个答案:

答案 0 :(得分:0)

您引入了通用歧义,编译器要求您明确说明要与此块静态链接的方法。函数表示法允许隐式传递参数,但是如果不指定类,编译器不知道要绑定的两个有效方法中的哪一个。由于这不是多态问题,因此它将在编译时受到约束,并且编译器需要使用明确的指令。