0

我遇到以下情况的问题:

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>)

4

1 回答 1

1

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

如果 item-type in & 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>is not assignable to List<Object>,因为添加到字符串列表中的对象会破坏只需要列表中字符串的代码。

一般来说,<?>是 . 的更好简写<? extends Object>。显然也有一些错误/不必要的警告与写它很长的路要走。见:http ://bugs.sun.com/view_bug.do?bug_id=6480391

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

于 2013-09-13T06:20:29.847 回答