public class SwitchExhaustivenessIn20Java { class A {} class B extends A {} sealed interface I permits C, D {} record C(T t) implements I {} final class D implements I {} record Pair(T x, T y){ } void foo(Pair> pairI) { switch (pairI) { case Pair>(C(String i), D snd) -> {} case Pair>(I fst, C snd) -> {} case Pair>(D fst, I snd) -> {} } } void foo2(Pair> pairI) { switch (pairI) { case Pair>(C(CharSequence i), D snd) -> {} case Pair>(I fst, C snd) -> {} case Pair>(D fst, I snd) -> {} } } sealed interface L1 { } final class L21 implements L1 { } final class L22 implements L1 { } sealed interface Boxed permits Box, Box2 {} record Box(L1 value) implements Boxed {} record Box2(L1 value) implements Boxed {} void foo3(Pair o) { switch (o) { case Pair(Box(L21 v1), Box(L22 v2)) -> { } case Pair(Box b1, Box b2) -> { } } } void foo4(Pair o) { switch (o) { case Pair(Box(L21 v1), Box2(L22 v2)) -> { } case Pair(Box(Object v1), Box(Object v2)) -> { } case Pair(Box2 b1, Boxed b2) -> { } case Pair(Box b1, Box2 b2) -> { } } } record PairString(T t, String t2){} void foo4(PairString o) { switch (o) { case PairString(Box(L21 v1), String t) -> { } case PairString(Box(L22 v2), String t2) -> { } case PairString(Box2 t, String t2) -> { } } } record StringPair(String t2, T t) { } void foo5(StringPair o) { switch (o) { case StringPair(String t, Box(L21 v1)) -> { } case StringPair(String t2, Box2 t) -> { } case StringPair(String t2, Box t) -> { } } } }