比较Scala反射符号

时间:2015-03-30 10:29:14

标签: scala reflection scala-reflect

Types Scaladoc页面警告:

  

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

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

对于TypeSymbol我显然可以使用.toType=:=,因此问题主要是关于TermSymbol s。

1 个答案:

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