Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

284
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!