Scala 中的统一类型系统
在本文中,我们将讨论统一类型系统在 Scala 中是如何工作的。统一类型系统本质上意味着有一个超类型可以继承其他子类型。在 Scala 中,Super-Type 是类Any 。因此类 Any 被称为root 。从 Any 派生出两个子类。
- AnyVal:所有值类型都扩展到 AnyVal 类。有九种预定义的值类型,它们不能为空:Double、Float、Long、Int、Short、Byte、Char、Unit 和 Boolean。
- 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 作为一种处理大数据分析的语言更加健壮和功能强大。