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

403
Visualizações
El método de extensión, cuando se invoca en un objeto nulo, se invoca en el tipo incorrecto
fun main() { val set: Set<Int>? set = null val emptySet: Set<Int> = set.orEmpty() }

¿No puedo entender por qué, incluso cuando se escribe explícitamente la variable establecida como Establecer <Int>? el compilador considera que en el método de extensión set.orEmpty () set - es una cadena y, en consecuencia, falla con un error:

Kotlin: Tipo de discrepancia: el tipo inferido es String pero se esperaba Set

Pero al declarar e inicializar en una línea, todo sucede correctamente:

 fun main() { val set: Set<Int>? = null val emptySet: Set<Int> = set.orEmpty() }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

El comportamiento que estás observando puede explicarse por la interacción de dos características de Kotlin:

  • primero, el tipo de variable set se reduce a Nothing? como resultado de un smart cast tras la asignación de valor null al mismo. La transmisión inteligente después de una asignación puede ser útil en los casos en que reduce el tipo de variable a un tipo más específico, pero ¿se reduce a Nothing? hace más mal que bien.
  • segundo, entre todas las sobrecargas de la función orEmpty disponibles para un valor de tipo Nothing? , el no genérico String?.orEmpty() se elige debido a la regla específica de resolución de sobrecarga de Kotlin: se prefiere un candidato no genérico a los genéricos.

De hecho, este comportamiento puede ser desconcertante, por lo que informé este problema como KT-50661 .

over 4 years ago · Santiago Trujillo Relatório

0

Creo que esto está relacionado con el hecho de que el compilador no es tan inteligente como para deducir que el conjunto de códigos = nulo se ejecutará exactamente una vez; podría ser cero veces o más de una vez.

Si sabe que ejecutará exactamente uno, puede decírselo al compilador usando una característica llamada kotlin.contracts:

 import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract @ExperimentalContracts fun main() { val set: Set<Int>? once { set = null } val emptySet: Set<Int> = set.orEmpty() } @ExperimentalContracts fun once(lambda: () -> Unit) { contract { callsInPlace(lambda, InvocationKind.EXACTLY_ONCE) } lambda() }

Consulte https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.contracts/

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