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?
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.