Sealed classes -- Feedback on compiler message

Gunnar Morling gunnar at hibernate.org
Wed Jun 10 17:50:03 UTC 2020


Thanks all, much appreciated!

--Gunnar

Am Di., 9. Juni 2020 um 20:34 Uhr schrieb Vicente Romero
<vicente.romero at oracle.com>:
>
> Hi Alex,
>
> Thanks for the message suggestions. I have created [1] to track this issue,
> Vicente
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8247270
>
> On 6/8/20 2:03 PM, Alex Buckley wrote:
> > On 6/6/2020 1:30 PM, Gunnar Morling wrote:
> >> I'm playing around a bit with sealed classes. As described in the JEP,
> >> the compiler rejects a subclass in another package when not compiling
> >> a named module. But the compiler error is not clear about the reason:
> >>
> >>      class is not allowed to extend sealed class:
> >> org.acme.sealed.Shipment
> >>
> >> Could it perhaps be a bit more specific, e.g.:
> >>
> >>     class is not allowed to extend sealed class in another package when
> >> not compiling a named module: org.acme.sealed.Shipment
> >
> > Another infelicity with the error message is that it doesn't make
> > clear if `org.acme.sealed.Shipment` is the superclass or the subclass.
> > Looking at javac's error templates for sealed classes:
> >
> > http://hg.openjdk.java.net/jdk/jdk/file/e7a068a7f1d0/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties#l3441
> >
> >
> > this infelicity does _not_ occur in other messages, e.g. at line 3464:
> >
> >   subclass {0} must extend sealed class
> >
> > So, rather than:
> >
> >   class is not allowed to extend sealed class: {0}
> >
> > consider:
> >
> >   class {0} in unnamed module cannot extend a sealed class in a
> > different package
> >
> >   class {0} in module {1} cannot extend a sealed class in a different
> > module
> >
> > Ideally, the relevant JLS text would live as comments in
> > compiler.properties? In this case, the JLS draft for JEP 360 shows in
> > 8.1.6 that two scenarios exist, which would motivate two messages in
> > compiler.properties:
> >
> >   If a sealed class C belongs to a named module, then every class
> > named in the permits clause of the declaration of C must belong to the
> > same module than C; otherwise a compile-time error occurs.
> >
> >   If a sealed class C belongs to an unnamed module, then every class
> > named in the permits clause of the declaration of C must belong to the
> > same package than C; otherwise or a compile-time error occurs.
> >
> > Alex
>


More information about the amber-dev mailing list