一尘不染

Scala的.type和Java的.class文字

java

从语言设计的角度来看,我想知道为什么Scala删除了Java的类文字(例如String.class)并替换为classOf[String],但是又添加了带有其Singletons
like Singleton.type而不是like之类的“类型文字” typeOf[Singleton]


阅读 266

收藏
2020-12-03

共1个答案

一尘不染

这是我的合理化:

classOf [T]

classOf定义Predef为具有此签名的函数:

def classOf[T]: Class[T]

尽管它是由编译器实现的,但可以使用函数语法 而不必在 语法 上创建任何特殊处理 。因此,这是考虑此选项的原因之一。

这样的替代方案String.class暗示每个类都有一个带有字段的伴随对象class。因此,存在两个问题:

  1. class 是一个关键字,因此会导致语法需要特殊情况的问题
  2. 如果只创建一个class A 没有 伴随对象的对象,那么引用它会很奇怪,A.class就像访问伴随对象上的 class 字段一样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仅用于指代单例对象的类型,因此它并不是那么频繁。

2020-12-03