2

Types Scaladoc页面警告:

类型相等可以用 =:= 检查。重要的是要注意 == 不应该用于比较类型的相等性 - == 不能在存在类型别名的情况下检查类型相等性,而 =:= 可以。

Symbols没有类似的警告,但是查看实现,它似乎没有覆盖equals。有没有办法比较符号是否相等(即它们是否代表相同的 Scala 类型/val/方法/等)?

对于TypeSymbols 我显然可以使用.toTypeand =:=,所以问题主要是关于TermSymbols 的。

4

1 回答 1

2

似乎==对符号很好(在一定程度上)。我不想尝试过度解释 scaladoc,但我认为别名对它们并不重要。(我也希望符号部分包含类似的警告。)

符号用于在名称和它所指的实体(例如类或方法)之间建立绑定。任何你在 Scala 中定义和命名的东西都有一个相关的符号。

Type

顾名思义,Type 的实例表示有关相应符号类型的信息。这包括直接声明或继承的成员(方法、字段、类型别名、抽象类型、嵌套类、特征等)、其基类型、擦除等。类型还提供了测试类型一致性或等效性的操作。

文档表明Types 包含比Symbols 更有价值的信息。

例子:

type L[A] = List[A]

scala> typeOf[L[String]].typeSymbol == typeOf[List[String]].typeSymbol
res47: Boolean = true

s 是相等的Symbol,即使Types 不是。因此,虽然sL[A]与别名List[A]不同,但它们都解析为相同的 s 。内部类型信息似乎消失了,并且似乎包含有关类本身的信息。TypeSymbolSymbolList

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可能不包含上面说明的完整比较所需的所有信息。

于 2015-03-30T14:32:27.900 回答