public class SealedExhaustive { sealed interface Shape permits Circle, Square, Rect {} record Circle(double r) implements Shape {} record Square(double side) implements Shape {} record Rect(double w, double h) implements Shape {} // No default: the compiler checks that every permitted subtype is covered. static double area(Shape s) { return switch (s) { case Circle(double r) -> Math.PI * r * r; case Square(double side) -> side * side; case Rect(double w, double h) -> w * h; }; } public static void main(String[] args) { for (Shape s : new Shape[]{new Circle(1), new Square(2), new Rect(2, 3)}) { System.out.printf("%s -> %.2f%n", s, area(s)); } } }