我遇到以下情况的问题:
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/