java - 泛型方法的问题

标签 java generics generic-method

我遇到以下情况的问题:

private static List<? extends Object> function1(final Collection<? extends Object>... collections) {
    final List<Object> result = new ArrayList<Object>();
    // do some work
    return result;
}


public static List<? extends Object> function2(final Collection<? extends Object>... collections) {
    // do some work
    return function1(collection);
}

最后一行错误为Type mismatch: cannot convert from Pair<String,List<capture#74-of ? extends Object>> to Pair<String,List<? extends Object>>

如何正确定义泛型?

更新: 应该可以在调用 function1(Collection<Long>, Collection<String>) 中使用不同的集合类型

最佳答案

您的声明并不意味着“function2”的参数类型和返回类型相同。

如果输入和输出的项目类型是通用的,您可以声明:

public static <T>  List<T> function2 (Collection<T>... inputs) {
    // do some work
    return function1( inputs);
}

public static <T>  List<T> function1 (Collection<T>... inputs) {
    // do some work
}

具有明显相似祖先的通配符类型不一定可以互相分配,如果它们的“捕获”不一定来自相同的位置或相同的类型。这还可以防止使用更通用的分配来添加不正确类型的项目。

例如,List<String>不可分配给List<Object> ,因为添加到字符串列表中的对象会破坏仅需要列表中的字符串的代码。

一般来说,<?><? extends Object> 的更好简写。显然,长时间编写它可能会出现一些错误/不必要的警告。参见:http://bugs.sun.com/view_bug.do?bug_id=6480391

“集合”是一个非常糟糕的参数调用,并且使用没有意义的名称/击键是一个错误。 “输入”是完全通用的,但至少它告诉您参数的走向并将其与“结果”清楚地区分开来。

关于java - 泛型方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779451/

相关文章:

java - 在 Java 上使用可比较数组时抛出异常

java - 为什么这段代码可以编译? (java泛型方法)

java - 为什么这个通用方法没有给出编译时错误?

java - 泛型方法返回类型

java - 获取给定标题的网站的总 cookie 大小

java - 如何锁定JFrame?

java - 用 joda time 计算平均时间

java - Hibernate 返回不匹配的行

c# - 从 Expression<Func<TModel, TProperty>> 转换为 Expression<Func<TModel, bool>>

Java Raw Type 和泛型交互