java - 使用 Generic VarArgs 在 Java 中进行不明确的方法调用

标签 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());
}

有什么办法解决这个问题吗?

最佳答案

因为 K 变量不受限制,所以调用确实有歧义 - 它可能是对三参数版本的调用,也可能是对 (String, K...) 3 自动装箱为 IntegerK 绑定(bind)到 Object 的版本。如果你称它为

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

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

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

此处编译器必须将K绑定(bind)到UUID以使返回类型匹配。

关于java - 使用 Generic VarArgs 在 Java 中进行不明确的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279259/

相关文章:

java - tomcat 的 Jersey 休息服务无法在 web.xml 中使用欢迎文件配置

java - 编码技巧 - 交集类型和 Java 枚举

generics - Java 数组协方差是否违反 Liskov 替换原则?

c# - 通用类的自定义属性抽屉 C# Unity

传递字符串时,Java 构造函数可变参数冲突

c - 如何正确使用 va_list?

java - 如何在同一终端中从我的 Java 应用程序打开 vi 编辑器?

java - 从 Hudson 上传 Artifact 到 Nexus 时出现 401 授权问题

java - 如何在同一个 @ControllerAdvice 中处理响应式(Reactive)和 mvc ServerHttpRequest?

c - 有没有办法从可变参数函数的参数中检索 float ?