我有一个通用的抽象类Factory<T>
,它有一个方法createBoxedInstance()
,该方法返回通过createInstance()
实现创建的T
实例,这些实例被包装在通用容器Box<T>
中。
abstract class Factory<T> {
abstract T createInstance();
public final Box<T> createBoxedInstance() {
return new Box<T>(createInstance());
}
public final class Box<T> {
public final T content;
public Box(T content) {
this.content = content;
}
}
}
有时我需要一个类型为
Box<S>
的容器,其中 S
是 T
的祖先。是否可能使 createBoxedInstance()
本身成为泛型函数,以便它将返回由调用者选择的 S
的实例的 Box<S>
?遗憾的是,如下定义函数是不起作用的,因为类型参数不能使用 super 关键字进行声明,只能进行使用。public final <S super T> Box<S> createBoxedInstance() {
return new Box<S>(createInstance());
}
我所能看到的唯一选择是使所有需要
Box<S>
实例的位置接受 Box<? extends S>
,这样容器的内容成员就可以分配给 S
。有没有什么方法可以避免将类型为
T
的实例重新打包到类型为 Box<S>
的容器中?(我知道我可以将 Box<T>
强制转换为 Box<S>
,但我会感到非常、非常内疚。)
Box<S>
,为什么不使用一个Factory<S>
呢?问题在于,即使 S 扩展了 T,你也无法知道Factory<T>
是否创建了一个装箱的 S,它可能是一个装箱的 U(也扩展了 T)。 - Peter LawreycreateBoxedInstance
中扩展 T,我只需在声明前面写上<S extends T>
即可。 - FeuermurmelList<T>
和List<S>
在类型系统上没有关联,即使S
和T
是相关的。现在我已经接受并拥抱了这个事实,即将一个类型声明为List<? extends X>
是有可能的,也正是基于这个原因。 - Feuermurmel