Estoy intentando escribir una función de Scala que devuelve el valor predeterminado de un tipo (0, 0.0, falso, '\ 0', etc. para tipos de valores y nulo para tipos de referencia). Se me ocurrió esto:¿Cómo puedo obtener el valor predeterminado para un tipo en Scala?
def defaultValue[U]: U = {
class Default[U] { var default: U = _ }
new Default[U].default
}
y si bien esto funciona bien si es llamado directamente, devuelve NULL incluso para los tipos de valor cuando se invocan mediante una función que sí es genérico, como se muestra en esta sesión REPL:
Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def defaultValue[U]: U = { class Default[U] {var default: U = _ }; new Default[U].default }
defaultValue: [U]U
scala> defaultValue[Boolean] // direct call works
res0: Boolean = false
scala> var res: Any = 0
res: Any = 0
scala> def setRes[U] = { res = defaultValue[U]; defaultValue[U] }
setRes: [U]U
scala> setRes[Boolean] // returns a Boolean, but...
res1: Boolean = false
scala> res
res2: Any = null // ... sets the res variable to null.
Puede alguien explicarme:
- por qué sucede esto (y por qué el compilador/intérprete no se queja si no hay suficiente información para que vuelva un verdadero booleano); y
- ¿cómo puedo solucionarlo?
He encontrado una forma de hacerlo con ClassManifests y haciendo coincidir el borrado, pero no se ve muy bien. –
¿Quién quiere apostar que el motivo no es borrado de tipo? De todos modos, dado que solo tiene un número finito de comportamientos deseados conocidos, ¿por qué no codificarlos? Feo, sí, pero probablemente sea más eficiente. – Raphael