使用Generic VarArgs在Java中调用Ambiguous方法

时间:2012-09-05 10:20:19

标签: java generics variadic-functions

我在尝试调用使用泛型和变量的重载方法时遇到编译错误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());
}

有什么方法吗?

1 个答案:

答案 0 :(得分:3)

因为K变量没有限制,所以调用确实是模糊的 - 它可能是对三参数版本的调用,或者它可能是对(String, K...)版本的调用,其中3自动装箱为{{ 1}}和Integer绑定到K。如果你把它称为

Object

使用K的显式绑定它将起作用,因为service.<UUID>getRecommendedIds(null, 3, UUID.randomUUID()); int都不能分配给Integer类型,因此调用必须是三个arg版本。如果您将调用的返回值分配给限制类型的变量,也可以在没有显式限制的情况下逃脱,即

UUID

此处编译器必须将List<UUID> ids = service.getRecommendedIds(null, 3, UUID.randomUUID()); 绑定到K以使返回类型匹配。