我想寫一個Scala函數,返回一個類型的默認值(0,0.0,假,'\ 0'等值類型和null爲參考類型)。我想出了這個:如何獲得Scala中某個類型的默認值?
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和匹配擦除,但它看起來不漂亮。 – 2011-03-10 14:33:24
誰打賭的原因是不是類型擦除?無論如何,既然你只有許多已知的期望行爲,爲什麼不硬編碼呢?醜陋,是的,但可能是最有效的。 – Raphael 2011-03-10 19:10:30