AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79266927
Accepted
user24723440
user24723440
Asked: 2024-12-10 11:17:51 +0800 CST2024-12-10 11:17:51 +0800 CST 2024-12-10 11:17:51 +0800 CST

Como determinar se o seguinte bloco de switches é exaustivo?

  • 772
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 tipo Box, e assim o conjunto que contém os padrões Box(A a), Box(B b), e Box(C c)pode ser reescrito para o conjunto que contém o padrão Box(I i). Isso ocorre porque o conjunto que contém os padrões A a, B b, C creduz-se ao padrão I i(porque o mesmo conjunto cobre o tipo I), e assim o conjunto que contém os padrões Box(A a), Box(B b), Box(C c)reduz-se ao padrão Box(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 ese 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 tipo Tse um dos seguintes casos se aplicar:

• O tipo Tnomeia uma classe selada abstrata ou interface selada Ce para cada subclasse ou subinterface direta permitida Dde C, uma das duas condições a seguir é válida:

  1. Não existe um tipo que nomeie De seja um subtipo de T, ou
  2. Existe um tipo Uque nomeia De é um subtipo de T, e Pabrange U.

• P reescreve para um conjunto Qe Qcobre T.

Um conjunto de elementos de caso, P, é reescrito no conjunto Q, se um subconjunto de Pfor reduzido a um >padrão p, e Qconsiste nos elementos restantes de Pjunto com o padrão p.

Um conjunto não vazio de padrões, RP, reduz-se a um único padrão rpse uma das seguintes condições for válida:

– RPabrange algum tipo Ue rpé um padrão de tipo do tipo U.

– RPconsiste em padrões de registro cujos tipos apagam todos para a mesma classe de registro Rcom k(k≥1) componentes e há um componente distinto cr(1≤r≤k) de Rtal forma que para cada outro componente ci (1≤i≤k, i≠r) o conjunto contendo os padrões de componentes dos padrões de registro correspondentes ao componente cié equivalente a um único padrãoqi , o conjunto contendo os padrões de componentes dos padrões de registro correspondentes ao componente crreduz-se a um único padrãoq e rpé o padrão de registro do tipo Rcom uma lista de padrões consistindo nos padrões q1, ..., 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: › EPconsiste em padrões de tipo cujos tipos têm todos a mesma eliminação T, e epé um padrão de tipo do tipo T. › EPconsiste em padrões de registro cujos tipos apagam todos para a mesma classe de registro Rcom k(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ão qj(1≤j≤k), e epé o padrão de registro do tipo Rcom uma lista de padrões de componentes consistindo nos padrões de componentes q1,...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 creduces 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 csurgiu.

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.

java
  • 1 1 respostas
  • 73 Views

1 respostas

  • Voted
  1. Best Answer
    Sweeper
    2024-12-10T16:07:47+08:002024-12-10T16:07:47+08:00

    "Corresponde a" significa apenas o que normalmente significa em inglês. X "corresponde a" Y significa que X corresponde a Y de alguma forma. Um padrão corresponde a um componente de registro significa que ele está tentando corresponder a esse componente de registro.

    Considere o registro record R(int x, int y, int z) {}e o padrão R(int a, int b, int c). Podemos dizer:

    • int acorresponde ao primeiro componentex
    • int bcorresponde ao segundo componentey
    • int ccorresponde ao terceiro componentez

    Aqui mostrarei que este conjunto de padrões (RP):

    • Box(A a)
    • Box(B b)
    • Box(C c)

    reduz-se ao padrão Box(I i)("rp").

    Aplicando a regra citada, RP consiste em padrões de registro que nomeiam o registro Box, que tem apenas um componente, então k=1. Podemos mostrar que o único componente que há neste registro satisfaz as condições de ser o "componente distinto" cr. ou seja, mostre que r=1

    cr precisa satisfazer duas condições:

    • para cada outro componente ci (1≤i≤k, i≠r) o conjunto contendo os padrões de componentes dos padrões de registro correspondentes ao componente ci é equivalente a um único padrão qi,
    • o conjunto contendo os padrões componentes dos padrões de registro correspondentes ao componente cr reduz-se a um único padrão q

    A primeira condição é vagamente verdadeira, pois não há outros componentes.

    "O conjunto que contém os padrões de componentes dos padrões de registro correspondentes ao componente cr" refere-se ao conjunto:

    • A a
    • B b
    • C c

    Todos esses são "padrões de registro" RP e todos eles "correspondem" ao único componente do registro (que é cr).

    Aqui está outro exemplo: o padrão Y yno padrão de registro R(X x, Y y, Z z)corresponde ao segundo componente de R.

    É trivial mostrar que A a, B be C ccobre I. Portanto I ié nosso "q".

    Agora vamos encontrar rp,

    rp é o padrão de registro do tipo R com uma lista de padrões consistindo dos padrões q1, ..., qr-1, q, qr+1, ..., qk

    k=1 neste caso, então a lista de padrões consiste apenas em q. Concluímos que rp é Box(I i).


    A primeira condição para cr é variadamente verdadeira neste caso, mas vamos supor que Boxtem dois componentes de registro, ambos do tipo I. E suponha que RP tem:

    • Box(A a, I i)
    • Box(B b, I i)
    • Box(C c, I i)

    Agora cr é o primeiro componente, e o único ci é o segundo componente. Os padrões que "correspondem" ao segundo componente são os três I i, e obviamente todos eles são equivalentes entre si. Então isso vai reduzir para Box(I i1, I i2).


    Por fim, vamos considerar se o switch possui os seguintes casos:

    • Box(A a, A a)
    • Box(B b, A a)
    • Box(C c, A a)
    • Box(A a, B b)
    • Box(B b, B b)
    • Box(C c, B b)
    • Box(A a, C c)
    • Box(B b, C c)
    • Box(C c, C c)

    Isso também é exaustivo, mas não podemos reduzir todos os 9 padrões de uma vez, porque não há componente que satisfaça essas duas condições para cr. Podemos reescrever esse conjunto 4 vezes para chegar a Box(I i1, I i2), cada vez reduzindo um subconjunto dos padrões.

    Primeiro, reduzimos os primeiros 3 padrões para Box(I i, A a), os próximos 3 padrões para Box(I i, B b), e os últimos três padrões para Box(I i, C c). Finalmente, reduzimos Box(I i, A a), Box(I i, B b), Box(I i, C c)para Box(I i1, I i2).

    • 2

relate perguntas

  • Lock Condition.notify está lançando java.lang.IllegalMonitorStateException

  • Resposta de microsserviço Muitos para Um não aparece no carteiro

  • Validação personalizada do SpringBoot Bean

  • Os soquetes Java são FIFO?

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve