java - Scala 的 .type 和 Java 的 .class 字面量

标签 java class scala types language-design

我从语言设计的角度想知道为什么 Scala 删除了 Java 的类文字(例如 String.class)并用 classOf[String] 替换它,但后来又添加了一个“类型文字”,它的单例像 Singleton.type 而不是像 typeOf[Singleton]?

最佳答案

这是我的理由:

classOf[T]

classOfPredef 中定义为具有此签名的函数:

def classOf[T]: Class[T]

虽然它是由编译器实现的,但使用函数语法是可能的无需在语法方面创建任何特殊处理。所以这是考虑这个选项的一个原因。

String.class 之类的替代方案意味着每个类都有一个带有 class 字段的伴生对象。所以有两个问题:

  1. class 是一个关键字,因此会导致语法需要特殊情况的问题
  2. 如果你只是创建 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/

相关文章:

java - OpenESB 电子邮件 BC SMTP 端口配置

java - 学习spring之前应该先了解一下Gradle和Maven?

C++:无法从指向类的指针调用成员

javascript - JS : TypeError: this. _init 不是函数。 (在 'this._init()' 中, 'this._init' 未定义)

scala - 在 Spark Shell 中打印所有定义的变量/方法签名 - Scala REPL

scala - 具有持久参与者的 Akka 分片的背压

java - 如何修复 'android.os.NetworkOnMainThreadException' ?

class - VB6 类有析构函数吗?

scala - 在 Databricks 中调用一次 Trigger 以处理 Kinesis Stream

java - 如何使用 Eclipse 调试 Spring Boot 应用程序?