【发布时间】:2011-07-12 17:32:08
【问题描述】:
我正在尝试编写一个 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.
谁能给我解释一下:
- 为什么会发生这种情况(以及为什么编译器/解释器在没有足够的信息返回真正的布尔值时不会抱怨);和
- 我该如何解决?
【问题讨论】:
-
我找到了一种使用 ClassManifests 并匹配擦除的方法,但它看起来并不漂亮。
-
谁愿意赌原因不是类型擦除?无论如何,既然你只有有限的许多已知的期望行为,为什么不对其进行硬编码呢?丑陋,是的,但可能是最有效的。
标签: generics scala null default-value