📜  Scala 中的统一类型系统

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

Scala 中的统一类型系统

在本文中,我们将讨论统一类型系统在 Scala 中是如何工作的。统一类型系统本质上意味着有一个类型可以继承其他子类型。在 Scala 中,Super-Type 是类Any 。因此类 Any 被称为root 。从 Any 派生出两个子类。

  1. AnyVal:所有值类型都扩展到 AnyVal 类。有九种预定义的值类型,它们不能为空:Double、Float、Long、Int、Short、Byte、Char、Unit 和 Boolean。
  2. AnyRef:所有引用类型都扩展至 AnyRef 类。用户自定义类默认定义引用类型;即他们总是(间接地)继承scala.AnyRef。 Java编程中的scala.AnyRef对应Java.lang.Object。

由于 Scala 在Java虚拟机上运行,它需要明确区分值类型和引用类型。为此,可以从根即 Any 继承两个子类 AnyVal 和 AnyRef。与大多数其他语言(如Java、C 等)不同。Scala 没有内置的原始类型。这些字节大小的数据类型被称为值类型,是 AnyVal 类的子类,后者又扩展到 Any(root)。这类似于Java等语言中的包装类或装箱类。换句话说,由于统一类型系统,所有字节大小的数据类型都是子类,继承自根类。但是,Scala 中属于值类型的变量不能用 new 关键字实例化。 new 关键字可用于引用类型。

下图表示值类型和引用类型如何与父类和根相关联。

在上图中,

  • 箭头代表继承。
  • 双线表示层次结构和隐式类型转换。

使用统一类型系统的优点如下:

  • 与其他类型系统相比,类型安全性更高。
  • 用其他语言创建的对象的互操作性和集成更容易。
  • 所有变量都可以访问某些通用方法,例如 equals、hashCode、toString。这是因为所有变量都是从根类 Any 继承的类的实例,其中定义了通用方法。

让我们通过一个示例来看看拥有统一类型系统的功能。

// Scala Program to print common elements
// from 2 lists
object Geek
{
    def main(args:Array[String])
    {
        // Creating a list with a fixed data type
        val GfG : List[String] = List("Geeks","for","Geeks")
          
        // Creating a List which can take 
        // variable data type input by Using Any
        val myList : List[Any] = List(
            "Geeks",
            "for",
            "Geeks",
            1000,
            525)
    myList.foreach( value => {
          
        //.contains() is an universally declared function
        if (GfG.contains(value)){
            println(value)
        }
    })
    }
}

输出:

Geeks
for
Geeks

在上面的示例中,我们看到我们能够通过指定类型Any来创建包含不同数据类型值的列表。因为 Any 是根类,所以这个表达式是合法的。此外,我们使用了.contains()方法来查看 List GfG 是否包含特定元素。 .contains()方法可用于 Lists、Sets 和某些其他集合,因为它是Any类中存在的通用函数。这只能归功于统一类型系统,从而使 scala 作为一种处理大数据分析的语言更加健壮和功能强大。