📜  斯卡拉 |价值类

📅  最后修改于: 2022-05-13 01:54:58.990000             🧑  作者: Mango

斯卡拉 |价值类

值类是一种有助于避免分配运行时对象的新机制。 AnyVal定义值类。值类是预定义的,它们与原始的类 Java 语言相吻合。
有九种预定义的值类型:Double、Float、Long、Int、Short、Byte、Char、Unit 和 Boolean。

equalshashCode不能由值类重新定义。值类主要用于优化性能和内存。

让我们通过一些例子来理解值类。

示例 #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)

价值类别的一些限制——

  • 值类可能没有专门的类型参数。可能没有专门的类型参数。
  • 值类可能没有嵌套或本地类、特征或对象。
  • equalshashCode不能由值类重新定义。
  • 值类不能有惰性 vals、vars 或 vals 作为成员。它只能有 defs 作为成员。
  • 没有其他类可以扩展值类。