我从语言设计的角度想知道为什么 Scala 删除了 Java 的类文字(例如 String.class
)并用 classOf[String]
替换它,但后来又添加了一个“类型文字”,它的单例像 Singleton.type
而不是像 typeOf[Singleton]
?
最佳答案
这是我的理由:
classOf[T]
classOf
在 Predef
中定义为具有此签名的函数:
def classOf[T]: Class[T]
虽然它是由编译器实现的,但使用函数语法是可能的无需在语法方面创建任何特殊处理。所以这是考虑这个选项的一个原因。
String.class
之类的替代方案意味着每个类都有一个带有 class
字段的伴生对象。所以有两个问题:
class
是一个关键字,因此会导致语法需要特殊情况的问题- 如果你只是创建
class A
没有一个伴随对象,那么能够引用A.class
会很奇怪,它就像访问配套A
上的 class 字段。
A.type:
关于为什么 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
仅用于引用单例对象的类型,因此它并不那么频繁。
关于java - Scala 的 .type 和 Java 的 .class 字面量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6118189/