【发布时间】:2016-02-11 12:00:50
【问题描述】:
我的问题简短而抽象:
我想实现一个Container 类,它由它包含的元素的Element 类类型进行类型参数化(即Container<T extends Element>)。到目前为止没有什么特别的。但是:Element 类及其子类应提供一个register方法,将Element 实例添加到给定的Containerclass(即register(Container<? super xxx> container) { ...})
我认为这个问题应该可以通过以下方式解决。但是,以下代码无效。特别是ElementBasis#register 和Sub1Element#register 中的类型参数会导致名称冲突错误。我仍然认为应该有可能找到该问题的正确实现。
public interface Element {
void register(Container<T super Element> container);
}
public class ElementBasis {
@Override
void register(Container<? super ElementBasis> container) {
container.add(this);
}
}
public class Sub1Element extends ElementBasis {
// ...
@Override
void register(Container<? super Sub1Element> container) {
container.add(this);
}
}
public class Sub2Element extends ElementBasis {
// ...
}
此外,我希望能够通过提供Element 的ElementGroup 子类来为元素提供结构:
public class ElementGroup<T extends Element> extends ElementBasis {
// ...
@Override
void register(Container<? super T> container) {
foreach(T member : groupMemebers) {
container.add(member)
}
}
}
我还尝试通过参数化Elementclasses 来解决这个问题,这样它的类型参数就可以在register 方法中使用。可惜没有成功。
谁能找到合适的实现?
【问题讨论】:
-
你的意思是
ContainerBasis?Container<? super ContainerBasis>对我来说没有多大意义。 -
你说得对,保罗。不是
ContainerBasis,而是ElementBasis。对不起。我已经更正了。