Java 设计:多态列表

Java Design : Polymorphic List

我有三个 classes A,B,C。

A是抽象的,B和C扩展了A。

我的目标是让用户能够制作 C 或 B 的列表(不要将两者都放在同一个列表中),我想通过智能设计强制用户这样做。

我的想法是抽象 class AList 函数:

void add (A a)  

和两个 classes:

BList 扩展 AList,函数 void add (B b) 覆盖 AList 的 add。

CList 扩展 AList,函数 void add (C c) 覆盖 AList 的 add。

但这没有用,因为在覆盖时您不能更改函数参数(更具体地说)。

如果您只想强制执行 List<B>List<C>,那么只需使用工厂方法即可:

class AList<T extends A> {
  private AList() {...} // users outside the class can't invoke the constructor

  public static AList<B> createBList() {
    return new AList<B>();
  }

  public static AList<C> createCList() {
    return new AList<C>();
  }
}

这会强制 class 以外的用户使用其中一种工厂方法,并且工厂方法只会创建 BC 的列表,而不是 As.

就是说,目前还不清楚您真正想要做什么。你无法阻止某人创建 ArrayList<A> 并将 BC 都放入其中,而且还不清楚你为什么要重新发明轮子并创建你的自己的列表类型。

虽然我喜欢@LouisWassermans 的解决方案,但你为什么不简单地使用泛型来解决你的问题?

public abstract class AList<T extends A>{

  public abstract void add(T a);

  ...

}

public class BList extends AList<B>{

  @Override
  public void add(B b){
    ...
  }
}

public class CList extends AList<C>{

  @Override
  public void add(C c){
    ...
  }
}