有没有办法在Java中实现代数类型?

时间:2008-10-04 03:14:28

标签: java class abstract-class final adts

在Java中,是否有可能强制某个类具有一组特定的子类而没有其他子类?例如:

public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}

我能否以某种方式强制执行A​​的其他子类无法创建?

4 个答案:

答案 0 :(得分:4)

为类 A 提供具有包级别可访问性的构造函数(并且没有其他构造函数)。

谢谢,Dave L.,因为没有其他建设者。

答案 1 :(得分:3)

你可能想要一个枚举(Java> = 1.5)。枚举类型可以具有一组固定值。它具有类的所有好处:它们可以具有字段和属性,并且可以使它们实现接口。枚举不能扩展。

示例:

enum A {

  B,
  C,
  D;

  public int someField;

  public void someMethod() {
  }


}

答案 2 :(得分:0)

您可以将A,B,C,D类放在一个单独的包中,并使A类不公开。

答案 3 :(得分:0)

对救援内容进行编码:

public abstract class A {
  public abstract <R> R fold(R b, R c, R d);
}

只有三种实现方式:

public final class B extends A {
  public <R> R fold(R b, R c, R d) {
    return b;
  }
}

public final class C extends A {
  public <R> R fold(R b, R c, R d) {
    return c;
  }
}

public final class D extends A {
  public <R> R fold(R b, R c, R d) {
    return d;
  }
}