Scala';s.type和Java';类文字

Scala';s.type和Java';类文字,java,class,scala,types,language-design,Java,Class,Scala,Types,Language Design,从语言设计的角度来看,我想知道为什么Scala删除了Java的类文字(例如,String.class)并将其替换为classOf[String],但随后添加了一个带有类似Singleton.type的单例的“type literal”,而不是类似typeOf[Singleton]?以下是我的合理化: classOf[T] classOf在Predef中定义为具有此签名的函数: def classOf[T]: Class[T] 虽然它是由编译器实现的,但是使用函数语法是可能的,而不需要在语法方面

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

以下是我的合理化:

classOf[T]

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

def classOf[T]: Class[T]
虽然它是由编译器实现的,但是使用函数语法是可能的,而不需要在语法方面创建任何特殊处理。所以这是考虑这个选项的一个原因。< /P> 类似于
String.class
的替代方法意味着每个类都有一个带有字段
class
的伴生对象。因此有两个问题:

  • class
    是一个关键字,因此会导致语法需要对其使用特殊情况的问题
  • 如果只创建
    class A
    ,而没有附带对象,那么能够引用
    A.class
    ,这就像访问附带
    A
    上的class字段一样,是很奇怪的
  • A.类型:

    关于[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
                 ^
    

    因此,拥有
    a并不是一个很大的延伸。type
    指的是对象的类型
    a
    。请注意,
    .type
    仅用于引用单例对象的类型,因此它并不经常使用。

    实际上,它是非常一致的
    Singleton.type
    Singleton
    的依赖类型,而
    classOf[Class]
    是方法的类型参数

    考虑这一点:

    class A {
        class B
    }
    
    val a: A = new A
    val b: a.B = new a.B
    
    这里的要点是,
    用于表示某个值的成员。它可以是
    val
    var
    def
    对象
    ,也可以是
    类型
    、类或
    特征

    因为singleton对象是一个值,所以
    singleton.type
    是完全有效的


    另一方面,类不是对象,因此
    class.class
    没有意义<代码>类不存在(作为值),因此无法获取其成员。另一方面,它的定义是
    def classOf[T]:Class[T]
    是纯Scala代码(即使实际实现是编译器魔法)。

    好问题。这种语法还阻止我们在
    match
    es中使用类文本,这是不幸的。
    .type
    的一个非常有用的用法是Scala的
    This.type
    ,特别适用于。
    class A {
        class B
    }
    
    val a: A = new A
    val b: a.B = new a.B