RFR: 8343306: javac is failing to determine disjoint-ness between a class and a sealed interface

Maurizio Cimadamore mcimadamore at openjdk.org
Thu Oct 31 13:49:28 UTC 2024


On Wed, 30 Oct 2024 20:48:27 GMT, Vicente Romero <vromero at openjdk.org> wrote:

> For code like:
> 
> 
> class Test {
>     sealed interface I permits C1 {}
>     non-sealed class C1 implements I {}
>     class C2 extends C1 {}
>     class C3 {}
>     I m(int s, C3 c3) {
>         I i = (I)c3;
>     }
> }
> 
> javac is failing to issue an error and accepts this code. The spec is clear stating that code like this should be rejected. See:
> 
> 5.1.6.1 Allowed Narrowing Reference Conversion:
> 
> • A class named C is disjoint from an interface named I if (i) it is not the case that
>   C <: I , and (ii) one of the following cases applies:
>   – C is freely extensible (§8.1.1.2), and I is sealed , and C is disjoint from all of
>   the permitted direct subclasses and subinterfaces of I .
> 
> and just below it continues:
> • A class named C is disjoint from another class named D if (i) it is not the case
> that C <: D , and (ii) it is not the case that D <: C .
> 
> so here we have the `C3` is a freely extensible class and interface `I` is sealed and `C3` is disjoint from `C1` which is is the permitted subclass of interface `I`
> 
> This PR should sync javac with the spec
> 
> TIA

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 1685:

> 1683:                 if (!ts.isInterface() && !ss.isInterface()) {
> 1684:                     return !isSubtype(erasure(ss.type), erasure(ts.type)) && !isSubtype(erasure(ts.type), erasure(ss.type));
> 1685:                 } else if (ts.isInterface() && !ss.isInterface() || !ts.isInterface() && ss.isInterface()) {

can be simplified to `ts.isInterface() != ss.isInterface()`

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 1694:

> 1692:                     } else {
> 1693:                         if (csym.isFinal()) {
> 1694:                             return true;

Maybe add a comment e.g. `not freely extensible`

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21794#discussion_r1824494592
PR Review Comment: https://git.openjdk.org/jdk/pull/21794#discussion_r1824496092


More information about the compiler-dev mailing list