Scala';s.type和Java';类文字
从语言设计的角度来看,我想知道为什么Scala删除了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] 虽然它是由编译器实现的,但是使用函数语法是可能的,而不需要在语法方面
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字段一样,是很奇怪的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