1

The method getRecommendedIds(String, Object&Comparable<?>&Serializable[]) is ambiguous for the type MyService尝试调用使用泛型和可变参数的重载方法时出现编译错误。

服务:

public interface MyService {
    public <K> List<K> getRecommendedIds(String datasource, K... ids);
    public <K> List<K> getRecommendedIds(String datasource, int limit, K... ids);
}

来电:

@Test(expected = NullPointerException.class)
public void testGetWithLimitThrowsNpeForNullDatasource() {
    service.getRecommendedIds(null, 3, UUID.randomUUID());
}

有没有办法解决?

4

1 回答 1

3

因为 K 变量没有限制,所以调用确实是模棱两可的——它可能是对三参数版本的调用,也可能是对(String, K...)将 3 自动装箱为 anIntegerK绑定到的版本的调用Object。如果你称它为

service.<UUID>getRecommendedIds(null, 3, UUID.randomUUID());

对于 K 的显式绑定,它将起作用,因为既int不能也不能Integer分配给UUID类型,所以调用必须是三个 arg 版本。如果您将调用的返回值分配给限制类型的变量,您也可以在没有显式限制的情况下逃脱,即

List<UUID> ids = service.getRecommendedIds(null, 3, UUID.randomUUID());

在这里,编译器必须绑定KUUID使返回类型匹配。

于 2012-09-05T10:27:09.610 回答