从语言设计的角度来看,我想知道为什么Scala删除了Java的类文字(例如String.class)并替换为classOf[String],但是又添加了带有其Singletons like Singleton.type而不是like之类的“类型文字” typeOf[Singleton]?
String.class
classOf[String]
Singleton.type
typeOf[Singleton]
这是我的合理化:
classOf [T]
classOf定义Predef为具有此签名的函数:
classOf
Predef
def classOf[T]: Class[T]
尽管它是由编译器实现的,但可以使用函数语法 而不必在 语法 上创建任何特殊处理 。因此,这是考虑此选项的原因之一。
这样的替代方案String.class暗示每个类都有一个带有字段的伴随对象class。因此,存在两个问题:
class
class A
A.class
A
一种:
关于为什么typeOf[A]可能会造成混淆。它看起来像一个函数调用,但是类型与函数结果不在同一个世界中(函数结果具有类型,但是类型本身仅在编译时有意义)。我可以将类型归因于变量:
typeOf[A]
scala> val a: A.type = A a: A.type = A$@c21a68
我不能分配一个函数返回的类型:
scala> val b = A.type <console>:1: error: identifier expected but 'type' found. val b = A.type ^
另一方面,类型可以是对象的成员:
scala> object A { type type1 = Int } defined module A scala> val x: A.type1 = 1 x: A.type1 = 1
因此,A.type引用对象的类型并不是一件大事A。请注意,.type仅用于指代单例对象的类型,因此它并不是那么频繁。
A.type
.type