比较Scala反射符号
Scaladoc页面警告: 可以使用=:=检查类型相等性。需要注意的是,不应使用==来比较类型是否相等--==在存在类型别名的情况下无法检查类型是否相等,而=:=可以 没有类似的警告,但查看,它似乎没有覆盖比较Scala反射符号,scala,reflection,scala-reflect,Scala,Reflection,Scala Reflect,Scaladoc页面警告: 可以使用=:=检查类型相等性。需要注意的是,不应使用==来比较类型是否相等--==在存在类型别名的情况下无法检查类型是否相等,而=:=可以 没有类似的警告,但查看,它似乎没有覆盖equals。是否有方法比较符号是否相等(即它们是否表示相同的Scala类型/val/method/等) 对于TypeSymbols,我显然可以使用.toType和=:=,因此问题主要是关于术语symbols。似乎=在某种程度上适用于符号。我不想过度解释scaladoc,但我认为别名与它们无关
equals
。是否有方法比较符号是否相等(即它们是否表示相同的Scala类型/val/method/等)
对于
TypeSymbol
s,我显然可以使用.toType
和=:=
,因此问题主要是关于术语symbol
s。似乎=
在某种程度上适用于符号。我不想过度解释scaladoc,但我认为别名与它们无关。(我也希望有关符号的部分也会包含类似的警告。)
符号用于在名称与其引用的实体(如类或方法)之间建立绑定。在Scala中定义并可以命名的任何东西都有一个关联的符号
与类型相比
:
顾名思义,Type的实例表示有关相应符号类型的信息。这包括直接声明或继承的成员(方法、字段、类型别名、抽象类型、嵌套类、特征等)、基类型、擦除等。类型还提供用于测试类型一致性或等效性的操作
文档表明,Type
s比Symbol
s包含更多有价值的信息
例如:
type L[A] = List[A]
scala> typeOf[L[String]].typeSymbol == typeOf[List[String]].typeSymbol
res47: Boolean = true
符号
s相等,即使类型
s不相等。因此,虽然L[A]
和List[A]
与别名的类型不同,但它们都解析为相同的符号。内部类型信息似乎已消失,而符号
似乎包含列表
类本身上的信息
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
可能不包含上面所示的完整比较所需的所有信息。只是出于好奇,您想比较termsmbol
s吗?从我的测试来看,等式工作得很好,但这取决于你想用它做什么。=
似乎适用于Symbol
,对类型参数进行模化。@m-z你是指类型符号吗?这对我不起作用,但在一个相当复杂的场景中。我看看能不能修好。编译器确保符号是唯一的。即使没有重写的Symbol.equals(即,我们使用Object.equals来比较符号),也有一个特定于实现的保证,即对符号使用==(或eq)将按预期工作。