Types Scaladoc页面警告:
类型相等可以用 =:= 检查。重要的是要注意 == 不应该用于比较类型的相等性 - == 不能在存在类型别名的情况下检查类型相等性,而 =:= 可以。
Symbols没有类似的警告,但是查看实现,它似乎没有覆盖equals
。有没有办法比较符号是否相等(即它们是否代表相同的 Scala 类型/val/方法/等)?
对于TypeSymbol
s 我显然可以使用.toType
and =:=
,所以问题主要是关于TermSymbol
s 的。
似乎==
对符号很好(在一定程度上)。我不想尝试过度解释 scaladoc,但我认为别名对它们并不重要。(我也希望符号部分包含类似的警告。)
符号用于在名称和它所指的实体(例如类或方法)之间建立绑定。任何你在 Scala 中定义和命名的东西都有一个相关的符号。
与Type
:
顾名思义,Type 的实例表示有关相应符号类型的信息。这包括直接声明或继承的成员(方法、字段、类型别名、抽象类型、嵌套类、特征等)、其基类型、擦除等。类型还提供了测试类型一致性或等效性的操作。
文档表明Type
s 包含比Symbol
s 更有价值的信息。
例子:
type L[A] = List[A]
scala> typeOf[L[String]].typeSymbol == typeOf[List[String]].typeSymbol
res47: Boolean = true
s 是相等的Symbol
,即使Type
s 不是。因此,虽然sL[A]
与别名List[A]
不同,但它们都解析为相同的 s 。内部类型信息似乎消失了,并且似乎包含有关类本身的信息。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
可能不包含上面说明的完整比较所需的所有信息。