JDK 15 Sealed Classes - how to use across packages?

2.1k views Asked by At

I have a simple sealed class, MyShape:

public sealed class MyShape permits MyCircle {

    private final int width;
    private final int height;

    public MyShape(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int width() {
        return width;
    }

    public int height() {
        return height;
    }
}

And one simple subclass, MyCircle:

public final class MyCircle extends MyShape {

    public MyCircle(int width) {
        super(width, width);
    }
}

Everything compiles and works when both classes are in the same package. If I move MyCircle into a sub-package, then the build breaks with: java: class is not allowed to extend sealed class: org.example.MyShape.

My understanding from the JDK 15 docs is that this should work. Am I missing a step?

I've created a GitHub repo if you want to experiment.

1

There are 1 answers

1
RStevoUK On BEST ANSWER

As stated in the documentation that you have linked:

JDK 15 Documentation

They must be in the same module as the sealed class (if the sealed class is in a named module) or in the same package (if the sealed class is in the unnamed module).