Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Scala反射符号_Scala_Reflection_Scala Reflect - Fatal编程技术网

比较Scala反射符号

比较Scala反射符号,scala,reflection,scala-reflect,Scala,Reflection,Scala Reflect,Scaladoc页面警告: 可以使用=:=检查类型相等性。需要注意的是,不应使用==来比较类型是否相等--==在存在类型别名的情况下无法检查类型是否相等,而=:=可以 没有类似的警告,但查看,它似乎没有覆盖equals。是否有方法比较符号是否相等(即它们是否表示相同的Scala类型/val/method/等) 对于TypeSymbols,我显然可以使用.toType和=:=,因此问题主要是关于术语symbols。似乎=在某种程度上适用于符号。我不想过度解释scaladoc,但我认为别名与它们无关

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)将按预期工作。