我遇到以下情况的问题:
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>)
答案 0 :(得分:1)
您的声明并不意味着参数类型&amp; “function2”的return-type是相同的。
如果项目类型在&amp; out很常见,你可以声明:
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
“collections”调用你的参数非常差,使用名字/按键没有意义是一个错误。 “输入”是完全通用的,但至少它告诉你参数的走向和方式。将其与“结果”区别开来。