我正在使用泛型来限制复合层次结构中的子类型,以便我可以在层次结构的不同层强制使用不同的类型。
例如,具有 (Business:Division:Department:Group:Person) 层次结构,其中每个级别的复合节点仅接受适当类型的子节点(层次结构中的下一个较低级别)。因此,我将使用实例化的每个级别类型的泛型来构造复合材料中的级别,以仅接受来自下一个较低级别的节点。
但是我收到泛型错误,并且不确定它是否表示设计错误,或者只是 java 泛型无法为我做的事情。这个想法似乎是有效的,我只想将 add() 方法接受的类型限制为只接受层次结构中特定下一级的子类型以强制结构级别。由于我只是在每个阶段降低类型的上限,因此发送到列表的所有消息仍然有效。
典型 GOF-Composite 模式中的顶级节点:
public abstract class Business { ... }
复合节点层次结构顶层:
public abstract class Group extends Business {
protected List<Business> subs; // composite links
public Group add(Business comp) {
subs.add(comp);
return this;
}
复合层次结构中的后续级别:
public class Area<T extends Business> extends Group {
protected List<Business> subs; // composite links
public Area(String title){
super(title);
subs = new ArrayList<Business>();
}
@Override
public Group add(T comp) { // ** Error Here **
super.add(comp);
return this;
}
错误是:
Multiple markers at this line - The method add(T) of type Area<T> must override a superclass method
- 名称冲突:Area 类型的方法 add(T) 与 Group 类型的 add(Business) 具有相同的擦除,但不会覆盖它
我尝试了一个变体,我给 Group::add() 方法提供了一个相似的类型,这样它们就有相同的类型签名,
公共组添加(T comp){ ... }
但这同样失败:
Multiple markers at this line
- Area 类型的方法 add(T) 必须覆盖超类方法 - 覆盖 labs.composite.company.Group.add - 名称冲突:Area 类型的方法 add(T) 与 add(T) 类型具有相同的擦除分组但不覆盖它
我在这里错过了什么吗???TIA
PS:实际上,我认为泛型的这种使用并不能完全满足我的要求(即使它确实有效!),因为我不仅想更改每个级别的上限,而且还需要在类型层次结构,而不是任何协变参数类型。我真的想要类似“对于作为 Composite 子类型的任何类型 T,在 add() 方法中只接受该类型的对象”,我认为泛型说“接受任何对象作为参数是 Composite 的子类型。我认为这是不可能的,因为 Java 中的参数是协变的,并且 LSP 将始终允许使用子类型。