sealed interface I permits A, B, C { }
final class A implements I { }
final class B implements I { }
record C(int j) implements I { } // Implicitly final
record Box(I i) { }
int testExhaustiveRecordPatterns(Box b) {
return switch (b) { // Exhaustive!
case Box(A a) -> 0;
case Box(B b) -> 1;
case Box(C c) -> 2;
};
}
Este é um exemplo que aparece na especificação da linguagem Java 22 (14.11.1.1) .
Posteriormente, a especificação fornece algumas explicações:
Determinar se esse bloco de switch é exaustivo requer a análise da combinação dos padrões de registro. O conjunto que contém o padrão de registro
Box(I i)
cobre o tipoBox
, e assim o conjunto que contém os padrõesBox(A a)
,Box(B b)
, eBox(C c)
pode ser reescrito para o conjunto que contém o padrãoBox(I i)
. Isso ocorre porque o conjunto que contém os padrõesA a
,B b
,C c
reduz-se ao padrãoI i
(porque o mesmo conjunto cobre o tipoI
), e assim o conjunto que contém os padrõesBox(A a)
,Box(B b)
,Box(C c)
reduz-se ao padrãoBox(I i)
.
No entanto, ainda não é detalhado o suficiente para mim. Posso ver que essas regras devem ser citadas ao determinar se o bloco switch é exaustivo (Algumas regras relevantes):
O bloco switch de uma expressão switch ou instrução switch é exaustivo para uma expressão seletora
e
se um dos seguintes casos se aplicar:• O conjunto que contém todas as constantes de caso e padrões de caso que aparecem em um rótulo de caso desprotegido (conhecidos coletivamente como elementos de caso ) associado ao bloco switch não é vazio e cobre o tipo da expressão do seletor
e
.
Um conjunto de elementos de caso,
P
, cobre um tipoT
se um dos seguintes casos se aplicar:• O tipo
T
nomeia uma classe selada abstrata ou interface seladaC
e para cada subclasse ou subinterface direta permitidaD
deC
, uma das duas condições a seguir é válida:
- Não existe um tipo que nomeie
D
e seja um subtipo deT
, ou- Existe um tipo
U
que nomeiaD
e é um subtipo deT
, eP
abrangeU
.•
P
reescreve para um conjuntoQ
eQ
cobreT
.
Um conjunto de elementos de caso,
P
, é reescrito no conjuntoQ
, se um subconjunto deP
for reduzido a um >padrãop
, eQ
consiste nos elementos restantes deP
junto com o padrãop
.Um conjunto não vazio de padrões,
RP
, reduz-se a um único padrãorp
se uma das seguintes condições for válida:–
RP
abrange algum tipoU
erp
é um padrão de tipo do tipoU
.–
RP
consiste em padrões de registro cujos tipos apagam todos para a mesma classe de registroR
comk
(k≥1) componentes e há um componente distintocr
(1≤r≤k) deR
tal forma que para cada outro componenteci
(1≤i≤k, i≠r) o conjunto contendo os padrões de componentes dos padrões de registro correspondentes ao componenteci
é equivalente a um único padrãoqi
, o conjunto contendo os padrões de componentes dos padrões de registro correspondentes ao componentecr
reduz-se a um único padrãoq
erp
é o padrão de registro do tipoR
com uma lista de padrões consistindo nos padrõesq1, ..., qr-1, q, qr+1, ..., qk
.Um conjunto não vazio de padrões EP é equivalente a um único padrão
ep
se uma das seguintes condições for válida: ›EP
consiste em padrões de tipo cujos tipos têm todos a mesma eliminaçãoT
, eep
é um padrão de tipo do tipoT
. ›EP
consiste em padrões de registro cujos tipos apagam todos para a mesma classe de registroR
comk
(k≥1) componentes e para cada componente de registro o conjunto contendo os padrões de componentes correspondentes dos padrões de registro é equivalente a um único padrãoqj
(1≤j≤k), eep
é o padrão de registro do tipoR
com uma lista de padrões de componentes consistindo nos padrões de componentesq1,...qk
.
No entanto, tenho alguma dificuldade em entender essas regras, especialmente as partes em negrito. Por exemplo,O que significa " from the record patterns matching to component ci "," from the record patterns matching to the component cr "?Para ser mais preciso, acho que não entendi bem o significado de " matching to " aqui. De acordo com as explicações na especificação, acho que a frase "This is because the set containing the patterns A a
, B b
, C c
reduces to the pattern I i
" deve ter usado as regras na parte em negrito.No entanto, não consigo descobrir como A a
, B b
, C c
surgiu.
Você poderia me ajudar a analisar os regulamentos na especificação em combinação com os exemplos?Sei que não é uma tarefa fácil. Obrigado por ler e responder.