Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

157
Visualizações
¿Cómo funciona exactamente como? comportarse en kotlin?

Me preguntaba por qué, ya if (x is MyGeneric<Int>) { ... } se bloqueará debido al borrado de tipo, como? obras. Quiero decir, ¿no se podría implementar A is B como (A as? B).let { if (it == null) false else true } ? En caso afirmativo, ¿por is los controles no pueden funcionar con los genéricos? En caso negativo, ¿en qué difiere?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Cuando lanza una clase que tiene tipos genéricos, la conversión siempre tendrá éxito si el tipo genérico es lo único que está mal. Y el borrado de tipo, con el que parece estar familiarizado, es la razón. En tiempo de ejecución, List<String> y List<Foo> son exactamente lo mismo debido al borrado de tipos, por lo que la conversión entre ellos siempre tendrá éxito.

Por lo tanto, una conversión segura no lo protege de equivocarse en el tipo genérico, solo en el tipo de clase.

over 4 years ago · Santiago Trujillo Relatório

0

as? obras

No, no lo hace. as? no devuelve nulo, incluso cuando los argumentos de tipo genérico no son compatibles:

 val strings = listOf("x", "y") val ints = strings as? List<Int>

El código anterior se compilará y ejecutará sin ningún error. Solo arrojará una excepción, cuando realmente saque cosas de ints e intente usarlas como Int s. La razón por la que esto sucede es, como dijiste, el borrado de tipos.

is podría haber diseñado para funcionar de la misma manera as? - evaluando como true incluso cuando los argumentos de tipo genérico no son compatibles:

 val strings = listOf("x", "y") strings is List<Int> // this could be designed to evaluate to true

Los diseñadores de Kotlin decidieron prohibir x is Foo<T> , pero permitir x as? Foo<T> .

Después de todo, "verificar el tipo" y "convertir el tipo" vienen con diferentes expectativas. Si me pregunta si una instancia de List<Int> es de tipo List<Int> , sería muy inesperado si dijera que sí. Por otro lado, si me pide que convierta una instancia de List<Int> en List<String> y lo hice con éxito (aunque sin verificar el contenido de la lista), eso no es tan inesperado. Después de todo, hice lo que me pediste.

Ahora para responder a tu pregunta:

Quiero decir, ¿no se podría implementar A es B como (A as? B).let { if (it == null) false else true } ? En caso afirmativo, ¿por is los controles no pueden funcionar con los genéricos?

Podría, pero esto produciría algunos comportamientos bastante inesperados, como se discutió en el párrafo anterior. Por lo tanto, está diseñado para no permitirlo.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda