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