斯卡拉 |价值类
值类是一种有助于避免分配运行时对象的新机制。 AnyVal定义值类。值类是预定义的,它们与原始的类 Java 语言相吻合。
有九种预定义的值类型:Double、Float、Long、Int、Short、Byte、Char、Unit 和 Boolean。
equals
或hashCode
不能由值类重新定义。值类主要用于优化性能和内存。
让我们通过一些例子来理解值类。
示例 #1:
// Scala program to illustrate value class
// Creating a value class and extend with AnyVal
case class C(val name: String) extends AnyVal
// Creating object
object gfg
{
// Main method
def main (args: Array[String])
{
// Creating the instance of the ValueClass
val c = new C("GeeksForGeeks")
c match
{
// new C instantiated here
case C("GeeksForGeeks") => println("Matched with GeeksForGeeks")
case C(x) => println("Not matched with GeeksForGeeks")
}
}
}
输出:
Matched with GeeksForGeeks
在上面的代码中,通过case class定义了一个value class,这里AnyVal定义了value class(C)。值类由一个字符串参数组成。当我们将传递与 case 语句相同的字符串时,这将返回 true,否则返回 false。
示例 #2:
// Scala program to illustrate value class
// Creating a value class and extend with AnyVal
class Vclass(val a: Int) extends AnyVal
{
// Defining method
def square() = a*a
}
// Creating object
object gfg
{
// Main method
def main (args: Array[String])
{
// creating the instance of the ValueClass
val v = new Vclass(5)
println(v.square())
}
}
输出:
25
正如我们所看到的,在上面的示例中,创建了一个值类并且表示是一个int 。上面的代码在值类Vclass
中包含一个def 。这里的Vclass
是一个用户自定义的值类,包装了Int参数,封装了一个square方法。要调用 square 方法,请创建 Vclass 类的对象,如下所示: val v = new Vclass(5)
价值类别的一些限制——
- 值类可能没有专门的类型参数。可能没有专门的类型参数。
- 值类可能没有嵌套或本地类、特征或对象。
-
equals
或hashCode
不能由值类重新定义。 - 值类不能有惰性 vals、vars 或 vals 作为成员。它只能有 defs 作为成员。
- 没有其他类可以扩展值类。