为什么在Predef
中引入了这些类型的别名和val?
答案 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
。