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

289
Visualizações
La función en línea reificada en Kotlin aún conduce a un error del compilador en la verificación 'es'

tengo la siguiente función:

 inline fun <reified T> create(preference: Preference<T>, title: String = ""): DebugOption{ val type = when (preference) { is Preference<String> -> Type.STRING is Preference<Boolean> -> Type.BOOLEAN else -> Type.STRING } return DebugOption(type, preference, displayTitle = StringModel(title)) }

Esperaba poder realizar fácilmente esta verificación 'es', ya que el tipo genérico está cosificado, pero sigo recibiendo un error de compilación:

 Cannot check for instance of erased type: Preference<String> Cannot check for instance of erased type: Preference<Boolean>

Así que estoy confundido, ¿cómo estoy usando mal 'reificado' / qué me estoy perdiendo aquí? ¿Hay algún problema con el uso de tipos genéricos cosificados como parámetro de tipo de otra clase?

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

0

El problema is que comprueba el tipo de preferencia de tiempo de ejecución preference y el tipo de preference de tiempo de ejecución no está disponible hasta que se haya borrado toda la información de tipo genérico. Después de todo, los tipos cosificados no son mágicos.

En cambio, lo que puede hacer es verificar T , ya que, como dijo, T está cosificado.

 val type = when (T::class) { String::class -> Type.STRING Boolean::class -> Type.BOOLEAN else -> Type.STRING }

Pero tenga en cuenta que si Preference es covariante (como List ) o contravariante, esto podría no funcionar como esperaba en algunos casos. Por ejemplo:

 // suppose Preference is covariant // (ie the type parameter is declared <out T>) val pref: Preference<Any> = Preference<Boolean>() create(pref, "foo")

En este caso, se infiere que T es Any , por lo que al type se le asignará Type.STRING . Si eso es inesperado para usted y desea Type.BOOLEAN en su lugar, es posible que desee usar otra forma de verificar el tipo de una preferencia, en lugar de los tipos cosificados, ya que esto no se puede determinar en el momento de la compilación.

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