Types Scaladoc页面警告:
可以使用=:=检查类型等式。重要的是要注意,==不应该用于比较类型的相等性 - ==在存在类型别名的情况下不能检查类型是否相等,而=:= can。
Symbols没有类似的警告,但查看implementation,它似乎无法覆盖equals
。有没有办法比较符号的相等性(即它们是否代表相同的Scala类型/ val /方法/等)?
对于TypeSymbol
我显然可以使用.toType
和=:=
,因此问题主要是关于TermSymbol
s。
答案 0 :(得分:2)
似乎==
对于符号(在某种程度上)是好的。我不想尝试过度解释scaladoc,但我不认为别名对它们很重要。 (我也希望关于符号的部分会包含类似的警告。)
符号用于在名称及其引用的实体(例如类或方法)之间建立绑定。您在Scala中定义并为其命名的任何内容都有一个关联的符号。
与Type
:
顾名思义,Type的实例表示有关相应符号类型的信息。这包括直接或继承声明的成员(方法,字段,类型别名,抽象类型,嵌套类,特征等),其基本类型,擦除等。类型还提供了测试类型一致性或等效性的操作。
文档表明Type
包含的信息比Symbol
更有价值。
示例:
type L[A] = List[A]
scala> typeOf[L[String]].typeSymbol == typeOf[List[String]].typeSymbol
res47: Boolean = true
Symbol
s相等,即使Type
不是。因此,虽然L[A]
和List[A]
与别名具有不同的Type
,但它们都会解析为相同的Symbol
。内部类型信息似乎已消失,Symbol
似乎包含List
类本身的信息。
scala> typeOf[List[String]].typeSymbol
res51: reflect.runtime.universe.Symbol = class List
scala> typeOf[L[String]].typeSymbol
res52: reflect.runtime.universe.Symbol = class List
所以这些是平等的:
scala> typeOf[L[String]].typeSymbol == typeOf[L[Int]].typeSymbol
res55: Boolean = true
虽然这些不是:
scala> typeOf[L[String]] =:= typeOf[L[Int]]
res56: Boolean = false
因此,虽然基础类型应该具有相同的Symbol
,但Symbol
可能不包含上述完整比较所需的所有信息。