es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo devolver una nueva instancia de `T` en una función reificada en línea?

Tengo el siguiente código:

private inline fun <reified T : Number> T.test(): T {
    if (T::class.java == Double::class.java) {
        return 0.0
    }

    return this
}

Esperaba que funcionara (siempre y cuando verifique el tipo de T), pero el IDE señala lo siguiente:

El literal de punto flotante no se ajusta al tipo esperado T

¿Hay alguna forma de hacerlo funcionar?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que la función intenta devolver un valor Double cuando el tipo genérico T no necesariamente es un subtipo de Double. Una forma de solucionarlo es utilizando el método Number::toDouble para convertir el valor genérico a Double antes de devolverlo. Aquí está el código modificado:

    private inline fun <reified t="" :="" number=""> T.test(): T {
        if (T::class.java == Double::class.java) {
            return 0.0 as T
        }
    
        return this.toDouble() as T
    }
    

    Con esta modificación, la función primero verifica si el tipo genérico es Double y devuelve 0.0 casteado como el tipo genérico T si es así. De lo contrario, convierte el valor genérico a Double utilizando el método toDouble y lo devuelve casteado como el tipo genérico T.

Comments are closed.