我试图模仿default
C#的关键字:
private class Default[T] {
private var default : T = _
def get = default
}
然后在我定义的包对象中:
def default[T] = new Default[T].get
我预计default[Int]
成为0
,但是
println(default[String])
println(default[Int])
println(default[Double])
println(default[Boolean])
所有打印品null
。然而
val x = default[Int]
println(x)
打印0
。如果我添加类型注释: Any
至x
它打印 null
再次。
我猜是因为println
需要 Any
类型的参数同样的事情也发生在那里。
将表达式分配给更通用类型的变量怎么可能改变该表达式的值?我发现这确实违反直觉。
这与拳击有关吗,所以我实际上调用了两个不同的 default
函数(一次使用原语 int
,一次使用 Integer
)?如果是的话,有没有办法避免这种情况?
最佳答案
研究生成的字节码后,我意识到实际发生了什么。 default[T]
always 返回 null
,但将其分配给基元会调用 BoxesRunTime.unboxTo...
将 null
转换为原始默认值。
关于scala - 为什么表达式的值取决于分配给它的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436182/