在进行 Scala编程时,我遇到了
虽然您可以定义自己的值类(请参见第11.4节), Scala中内置了九个值类:字节,短型,字符,整数,长型, 浮点数,双精度,布尔值和单位。其中前八个对应 Java的原始类型,它们的值在运行时表示 时间作为Java的原始值。这些类的实例是 在Scala中全部以文字形式编写。例如,42是 Int,“ x”是Char的实例,而false是Boolean的实例。您 无法使用new创建这些类的实例。 这是强制性的 通过“技巧”,将值类都定义为抽象的 最后。
在Scala中,E
给出错误new Int
的原因。 Java允许class Int is abstract; cannot be instantiated
val a: Int = new Int
。
问题:作者正在研究的new Integer(23)
是什么。为什么Scala将trick
定义为value classes
。
答案 0 :(得分:1)
作者正在采取的技巧是什么?
“把戏”是
new
)。因此,值类不能由应用程序代码实例化。
为什么Scala将值类定义为抽象的和最终的。
值类的要点是它们是由其(不可变的)值/内容定义的。对象身份无关。
Scala编译器还尝试通过尽可能不创建任何对象(仅直接使用未装箱的原语)来优化值类。只有在我们确定可以随意装箱和拆箱的情况下,这才起作用。
在Java new Integer(1)
和另一个new Integer(1)
中,这是两个不同的对象,但这对纯值类没有用(如果您想将这些不同的实例用作锁定监视器对象或其他您要使用的对象,需要对象标识,您只是使自己和他人感到困惑,不应使用Integer
)。