为什么当只有一个方法在分离时有效时,这个Java泛型方法调用是模棱两可的?
我试图理解为什么编译器无法解析方法调用。我希望始终选择,因为 由于 上的上限,因此永远无法匹配。bar
bar(Xyz::new)
bar(Supplier)
bar(T extends Xyz)
Xyz
public <T extends Xyz> void foo(T s) {}
public <T extends Xyz> void bar(T s) {}
public <T extends Xyz> void bar(Supplier<T> s) {}
public void example() {
foo(Xyz::new); // not valid (does not extend Xyz)
bar((Supplier<Xyz>) Xyz::new); // valid (explicitly a Supplier)
bar(Xyz::new); // ambiguous - but only one method is valid?
}
public static class Xyz {}
如果 不适用,即使单独使用(如图 所示),那么唯一的选择肯定是使这成为一个非模棱两可的重载。bar(T)
foo(T)
bar(Supplier)
为什么调用是模棱两可的,特别是当 和 调用本身不是有效的分辨率时?bar
foo
bar(T)
上述代码的可运行示例:https://www.jdoodle.com/ia/kqP