javaclassabstract-classfinaladts

Is there a way to implement algebraic types in Java?


Is it possible, in Java, to enforce that a class have a specific set of subclasses and no others? For example:

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

Can I somehow enforce that no other subclasses of A can ever be created?


Solution

  • Church encoding to the rescue:

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

    There are only three implementations possible:

    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;
      }
    }