Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java设计:多态列表_Java_Data Structures_Polymorphism_Abstract - Fatal编程技术网

Java设计:多态列表

Java设计:多态列表,java,data-structures,polymorphism,abstract,Java,Data Structures,Polymorphism,Abstract,我有三个班A、B、C A是抽象的,B和C扩展了A 我的目标是让用户能够列出C或B的列表(不要两者都在同一个列表中),我希望通过智能设计强制用户这样做 我的想法是让抽象类具有函数: void add (A a) 和两类: BList扩展了AList,函数void add(B)覆盖了AList的add CList扩展了AList,函数void add(C)覆盖了AList的add 但这不起作用,因为在重写时无法更改函数参数(更具体地说)。如果只想强制执行列表或列表,那么方法就是使用工厂方法:

我有三个班A、B、C

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

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

我的想法是让抽象类具有函数:

void add (A a)  
和两类:

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

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


但这不起作用,因为在重写时无法更改函数参数(更具体地说)。

如果只想强制执行
列表或
列表,那么方法就是使用工厂方法:

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>();
  }
}
类列表{
private AList(){…}//类外的用户无法调用构造函数
公共静态列表createBList(){
返回新列表();
}
公共静态列表createCList(){
返回新列表();
}
}
这将强制类外的用户使用其中一个工厂方法,工厂方法将只创建
B
s或
C
s的列表,而不是
A
s


也就是说,不清楚你到底想做什么。你无法阻止某人创建
ArrayList
并将
B
s和
C
s都放在其中,而且你也不清楚为什么要重新发明轮子并创建自己的列表类型

虽然我喜欢@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){
    ...
  }
}
公共抽象类{
公开摘要无效添加(TA);
...
}
公共类BList扩展{
@凌驾
公共无效添加(B){
...
}
}
公共类CList扩展了{
@凌驾
公共空间添加(C){
...
}
}

你的意思是不让两者都在同一个列表中吗?你不需要static之后的generic吗?@YassinHajaj不,那就不符合要点了。在静态之后,不能主动使用泛型。您不需要新的类型变量,您需要引用特定的命名类。哦,是的,谢谢。简短的名称让我感到困惑。@LouisWasserman感谢这个想法,我正在编写一个导入程序A、B、C封装用户需要向我提供的其他类B或C的列表,我可以告诉用户给我列表,但我必须手动检查(例如使用instanceof)他没有混合B和C,或者我可以利用你的想法,请用户向我提供列表,这样用户就不会犯错误并混合它们。