java - 我可以像参数一样引用子类吗?

标签 java subclass abstract

我想在我的抽象类中引用任何潜在的子类,例如参数,以创建通用函数,例如,在不重载的情况下创建子类的新实例。

abstract class Fictional
{
  public static ArrayList<SUBCLASS_PARAM> subclassArray = new ArrayList<SUBCLASS_PARAM>();
  int i;

  private Fictional(int i) //All subclasses have to implement this constructor
  {
     this.i = i;
     //body
  }

  public static SUBCLASS_PARAM loadFromFile() //I wouldn't have to override this method
  {
     SUBCLASS_PARAM subclass = new SUBCLASS_PARAM(1); //it's not possible to make new instance of abstract class, but it would be possible with any other subclass
     subclassList.put(subclass);
     return subclass;
  }
}

class Real extends Fictional
{
//nothing here
}

class main
{
  Real r = Real.loadFromFile()
}

有什么办法可以制作这样的东西吗?

最佳答案

您可以使用泛型和子类来做到这一点,如下所示:

public abstract class Fictional<A extends Fictional> {
    public ArrayList<A> subclassArray = new ArrayList<A>();
    int i;

    public Fictional(int i) {
        this.i = i;
    }

    public A loadFromFile() //I wouldn't have to override this method
    {
        A subclass = this.build(1); //it's not possible to make new instance of abstract class, but it would be possible with any other subclass
        subclassList.put(subclass);
        return subclass;
    }

    protected abstract A build(int i);
}

class Real extends Fictional
{
    public Real(int i) {
        super(i);
    }

    @Override
    protected Fictional build(int i) {
        return new Real(i);
    }
}

关于java - 我可以像参数一样引用子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084448/

相关文章:

ios - 从外部类管理 UIPickerView - 使用 Swift

javascript - Typescript - 强制覆盖子类中的静态变量

java - Spring Boot路径参数url编码问题

java - 如何制作一个具有多个文本字段的输入对话框(即可以接受很多输入)

强制在构造函数中调用 super() 的子类的 Java 解决方法?

ios - 为什么我不能直接设置一些类属性?

php - 为什么 PHP 5.2+ 不允许抽象静态类方法?

c# - 如何为抽象类中的只读字段赋值?

java - 我无法在 Intellij IDEA GUI 设计器上调整元素大小或移动元素

java - 使用来自外部类的信息 : Prisoner's Dilemma