【发布时间】:2009-03-31 19:01:51
【问题描述】:
想象一个通用类 MySet,它维护一个父 MySet 实例和一个子 MySet 实例。这个想法是,父母应该能够持有 T 的超集,而孩子应该能够持有 T 的子集。因此,给定以下示例,请考虑以下问题:
class MySet<T> {
MySet<? extends T> child;
void doStuff (Collection<? extends T> args) {
child.doStuff(this, args);
}
}
编辑:固定问题和示例代码以反映实际问题
现在,子泛型<T> 可能比父级的<T> 更具限制性,因此父级必须传入一个集合<X>,其中<X> 符合子级的<T>。请记住,这个父->子链可以任意延长。有没有办法安排泛型,以便 parent.doStuff(...) 编译,即,它只能用它最严格的孩子的参数来调用?
这意味着 java 编译器将把通用信息一直向上传递到 parent->child 链,以确定 doStuff 的允许参数可能是什么,我不知道它是否具有这种能力。
是唯一的解决方案,以确保孩子不能比使用泛型的父母更严格(即 MySet<T> child;而不是 MySet<? extends T>)并且在代码的其他地方让孩子比父母更严格?
【问题讨论】:
-
在 JDK 1.6.0_10 上编译得很好。
-
嗯,我的代码中的示例可能过于简单化了。让我看看。