disjoint or not disjoint?

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Oct 29 15:26:12 UTC 2024


I agree with your analysis - this seems a javac bug - C3 and I (or C1) 
have nothing to do with each other.

Maurizio

On 29/10/2024 11:39, Stephan Herrmann wrote:
> Please consider this source:
>
> public class X1 {
>     sealed interface I permits C1 {}
>     non-sealed class C1 implements I {}
>     class C2 extends C1 {}
>     class C3 {}
>     I m2(int s, C3 c3) {
>         return switch (s) {
>             case 0 -> (I) c3;
>             case 1 -> (C1) c3;
>             case 2 -> (C2) c3;
>             default -> null;
>         };
>     }
> }
>
> javac raises errors at case 1 and case 2 but not at case 0.
>
> If we're reading the spec correctly, then also case 0 would be illegal:
>
> * A class named C is disjoint from an interface named I if ...
>   * 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.
>
> with C=C3, I=I we are asking if C3 is disjoint from C1.
>
> * 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.
>
> with C=C3 and D=C1 we asking C3 <: C1 and C1 <: C3, both being false.
>
> Actually, in case 1 javac agrees with this last line of reasoning.
>
>
> Do you agree that this is a bug in javac, or am I missing some subtlety?
>
> thanks
> Stephan


More information about the compiler-dev mailing list