为什么在Predef.scala中重新定义类型变量?

时间:2015-04-09 04:06:34

标签: scala

enter image description here

为什么在Predef中引入了这些类型的别名和val?

3 个答案:

答案 0 :(得分:3)

Predef中的内容会自动导入。在Scala中,您可以编写

val mySet : Set[String] = Set( "cat", "dog", "poop" )

无需先写

import scala.collection.immutable.Set

请注意,我上面写的声明可能已被等效地写为

val mySet : Set[String] = Set.apply( "cat", "dog, "poop" )

在等号的右侧,单词Set指的是单个对象。我们只能调用对象上的方法(无论是单例还是类的实例)。我们无法在类型上调用方法。不知何故,我们必须自动导入对象Set的名称。这就是Predef声明

val Set = immutable.Set

确实

如果您是Java程序员,您可以考虑一个val声明,该声明仅指向一个对象,否则该对象需要使用导入或更长的名称,因为它等同于{{1} }。

冒号后面和等号前面的import static是一个类型注释。在这种情况下,Set[String]是一种类型。对象不是类型。如果我们在Set[String]中声明的所有内容都是Predef,则我们的声明无法编译。我们原本会说val的类型是某个特定的对象,但是类型与对象非常不同,类型是对象可能属于的类别的描述。

要让mySet也作为一种类型,我们需要类型别名

Set

如果您是java程序员,则其功能类似于类型名称的非静态type Set[A] = immutable.Set[A] 。 (Scala也有导入,但它们必须限定为特定的块或文件.Predef中的import别名可用于所有Scala文件,因此它的作用远远超过类型的type做。)

import包含一个对象,声明为

scala.collection.immutable

和一个声明为

的类型
object Set{ ... }

如果我们希望能够同时使用对象(及其有用的工厂方法)和类型(我们工厂创建的对象的编译时描述),我们需要同时创建它们,对象和类型,可用于我们的代码。您在上面引用的两行(对于trait Set[A]{ ... } )就是这样做的。 (另外两行对Set的确如此。)

答案 1 :(得分:0)

我相信这些类型和val只会使导入变得不必要。

vals将伴侣对象分配到val中 - 再次,摆脱导入。

我怀疑他们是以这种奇怪的方式完成的,以避免Predef.scala和Map / Set.scala之间的循环编译时依赖,但我只是猜测。

答案 2 :(得分:0)

Predef的重点是避免明确的资格和导入声明。来自docs

  

Predef对象提供了所有可访问的定义   Scala编译单元没有明确的资格。

     

Predef为常用类型提供类型别名,例如不可变集合类型scala.collection.immutable.Map,   scala.collection.immutable.Set和。{   scala.collection.immutable.List构造函数   (scala.collection.immutable.::scala.collection.immutable.Nil)。

这样,您可以参考Map,而无需明确限定或导入scala.collection.immutable.Map