我有一个非通用这样的代码:泛型类型的参数,这也是一个返回值
class List {
List intersect(List out, List other) {
if (out == null) out = new List();
// insert elements common to $this and $other into $out
return out;
}
}
这种方法安全地使用混合类型包含的对象的使用:
other
能含有较多的特定类型(子类)out
可以包含少特定类型的(超)
E.g. (而不是从真正的代码)
List<Number> my;
List<Integer> other;
List<Object> result = new();
result = my.intersect(result, other);
我需要因此:
class List<T> {
<R super T> List<R> intersect(List<R> out, List<? extends T> other);
}
然而,这并不编译。泛型常见问题指出,类型参数的下限没有意义,但我无法看到它给出上面的例子。
我得到的最接近的是:
List<? super T> intersect(List<? super T> out, List<? extends T> other);
但是这需要在调用点返回值的显式转换。
是否有可能以对所有现有用法都是安全的方式来生成此方法?
UPDATE: 在情况下,它并不明显:(这是一个接口顺便说一句),这不是一个java.util.List但自定义类。不相关的部分被省略,但方法签名完全如图所示(访问级别除外)。
UPDATE2: 通过类型安全我指的是尽可能限制。理想情况下,所有参数都应遵守上述两条规则。
是'intersect`一个静态方法?如果没有,我有点困惑为什么有列表实例本身和2个列表参数? – 2011-02-07 00:45:17
只是一个方面说明:你知道的方法List.retainAll:http://download.oracle.com/javase/6/docs/api/java/util/List.html#retainAll%28java.util.Collection% 29 ? – Puce 2011-02-07 02:36:56
它不是静态的,它不是java.util.List – 2011-02-08 13:08:40