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