我注意到了使用泛型和lambdas重载方法的奇怪行为.这个类工作正常:
public <T> void test(T t) { }
public <T> void test(Supplier<T> t) { }
public void test() {
test("test");
test(() -> "test");
}
Run Code Online (Sandbox Code Playgroud)
没有模糊的方法调用.但是,将其更改为此会使第二个调用变得模糊:
public <T> void test(Class<T> c, T t) { }
public <T> void test(Class<T> c, Supplier<T> t) { }
public void test() {
test(String.class, "test");
test(String.class, () -> "test"); // this line does not compile
}
Run Code Online (Sandbox Code Playgroud)
怎么会这样?为什么添加另一个参数导致方法解析不明确?为什么它能说明第一个例子中供应商和对象之间的区别,而不是第二个例子?
编辑:这是使用1.8.0_121.这是完整的错误消息:
error: reference to test is ambiguous
test(String.class, () -> "test");
^
both method <T#1>test(Class<T#1>,T#1) in TestFoo and method …Run Code Online (Sandbox Code Playgroud)