Я пытаюсь написать функцию Scala, которая возвращает значение по умолчанию для типа (0, 0.0, false, '\ 0' и т.д. для типов значений и null для ссылочных типов). Я придумал это:
def defaultValue[U]: U = {
class Default[U] { var default: U = _ }
new Default[U].default
}
и хотя это хорошо работает, если вызвано напрямую, оно возвращает null даже для типов значений при вызове через функцию, которая сама по себе является общей, как показано в этом сеансе 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.
Может кто-нибудь объяснить мне:
- почему это происходит (и почему компилятор/интерпретатор не жалуется, если нет достаточной информации для его возврата true Boolean); и
- Как я могу это исправить?