scala - 为什么表达式的值取决于分配给它的变量?

标签 scala type-inference

我试图模仿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 。如果我添加类型注释: Anyx它打印 null再次。

我猜是因为println需要 Any 类型的参数同样的事情也发生在那里。

将表达式分配给更通用类型的变量怎么可能改变该表达式的值?我发现这确实违反直觉。

这与拳击有关吗,所以我实际上调用了两个不同的 default函数(一次使用原语 int ,一次使用 Integer )?如果是的话,有没有办法避免这种情况?

最佳答案

研究生成的字节码后,我意识到实际发生了什么。 default[T] always 返回 null,但将其分配给基元会调用 BoxesRunTime.unboxTo...null 转换为原始默认值。

关于scala - 为什么表达式的值取决于分配给它的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436182/

相关文章:

Scala 宏 : how to pass additional arguments

scala - Scala中的自定义异常

mysql - 使用 mysql 的 Scala Slick c3p0 连接池

scala - 序列理解中的多重 yield ?

Java/Groovy 泛型类型推断

scala - Scala 常量的命名约定?

generics - 当我在 Haskell 中编写 "show"和 "read"时发生了什么?

涉及 boolean 值的 Java 8 类型推断

haskell - Haskell 类型推断令人困惑

斯卡拉 : Does variable type inference affect performance?