Refinements for sealed types

Brian Goetz brian.goetz at
Wed Aug 21 00:05:15 UTC 2019

I do, because the other way to get a class into the same compilation unit, aux classes, have some limitations.  So we’re encouraging the pattern of nesting.  But … I am not sure we want to push it all the way.  Consider a type like:

    sealed interface Fruit {
        interface RedFruit extends Node { }
        interface BlueFruit extends Node { }
        class Strawberry implements RedFruit { }
        class Raspberry implements RedFruit { }
        class Blueberry implements BlueFruit { }

Do we want to force Blueberry to be Fruit.BlueFruit.Blueberry (or at least, twist the user’s arm into it by offering less ceremony?)  I think that would be lame — and worse than lame if the intermediate interfaces (RedFruit, BlueFruit) were not public.  Then we’d be nesting the public types in the nonpublic ones, and they’d be inaccessible.  

> You often show the concrete classes as members of a sealed interface. Interface members are already implicitly public and static; is this a precedent to build on for a sealed interface? That is, have the nested concrete classes be implicitly final, and have the interface's implicit `permits` list care about only nested concrete classes. Top level concrete classes in the same compilation unit would be handed like concrete classes in other compilation units: nothing different than today.
> Layering sealing on top of nesting has the attraction that it avoids putting multiple public concrete classes in a single compilation unit. It's right that the concrete leaves are public, but javac dislikes compilation units with multiple public types.
> Alex

More information about the amber-spec-experts mailing list