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

Apo*_*isp 7 java abstract-class final class adts

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

public abstract class A {}
public final class B extends A {}
public final class C extends A {}
public final class D extends A {}
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式强制执行不能创建A的其他子类吗?

Apo*_*isp 0

教会编码来拯救:

public abstract class A {
  public abstract <R> R fold(R b, R c, R d);
}
Run Code Online (Sandbox Code Playgroud)

只有三种可能的实现:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)