The following enhanced switch is accepted as exhaustive by javac, but fails at runtime with a MatchException.
From my reading of https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-14.11.1.1 this seems like a bug.
```
class B {
abstract static sealed class Sealed<T extends Sealed<T>> permits One, Two {}
abstract static non-sealed class One extends Sealed<One> {}
abstract static non-sealed class Two<V extends Two<V>> extends Sealed<V> {}
public static void test(Sealed<?> sealed) {
switch (sealed) {
case One one -> {}
}
}
public static void main(String[] args) {
class F extends Two<F> {}
test(new F());
}
}
```
$ java -fullversion
openjdk full version "25-ea+4-344"
$ javac -Xlint:all -Werror B.java
$ java B
Exception in thread "main" java.lang.MatchException
at B.test(B.java:10)
at B.main(B.java:17)
From my reading of https://docs.oracle.com/javase/specs/jls/se23/html/jls-14.html#jls-14.11.1.1 this seems like a bug.
```
class B {
abstract static sealed class Sealed<T extends Sealed<T>> permits One, Two {}
abstract static non-sealed class One extends Sealed<One> {}
abstract static non-sealed class Two<V extends Two<V>> extends Sealed<V> {}
public static void test(Sealed<?> sealed) {
switch (sealed) {
case One one -> {}
}
}
public static void main(String[] args) {
class F extends Two<F> {}
test(new F());
}
}
```
$ java -fullversion
openjdk full version "25-ea+4-344"
$ javac -Xlint:all -Werror B.java
$ java B
Exception in thread "main" java.lang.MatchException
at B.test(B.java:10)
at B.main(B.java:17)
- links to
-
Review(master) openjdk/jdk/23286