Int Type vs scala.Int Type

时间:2017-07-21 20:57:42

标签: scala reflection

我正在使用scala反射来获取不是方法的案例类的所有字段。然后我想看看类型是原始类型还是字符串(或者这些东西的选项)。这是一个简单的工作示例,用于检查字段是否为字符串。

scala> case class SimpleCase(val1: String)
defined class SimpleCase

scala> val members = typeOf[SimpleCase].members.filter(!_.isMethod).toList
members: List[reflect.runtime.universe.Symbol] = List(value val1)

scala> members.head.typeSignature
res57: reflect.runtime.universe.Type = String

scala> members.head.typeSignature == typeOf[String]
res58: Boolean = true

完全按照我期望的方式工作。事情变得奇怪 - 当我使用Int或任何原始类型做同样的事情时,类型检查测试失败。以下是所述失败的一个例子:

scala> case class SimpleCase(val1: Int)
defined class SimpleCase

scala> val members = typeOf[SimpleCase].members.filter(!_.isMethod).toList
members: List[reflect.runtime.universe.Symbol] = List(value val1)

scala> members.head.typeSignature
res59: reflect.runtime.universe.Type = scala.Int

scala> members.head.typeSignature == typeOf[Int]
res60: Boolean = false

scala> members.head.typeSignature == typeOf[scala.Int]
res61: Boolean = false

此外,typeOf [Int]打印出来

scala> typeOf[Int]
res62: reflect.runtime.universe.Type = Int

SimpleCase的{​​{1}}类型签名表明它是val1而不是scala.Int的类型签名,即typeOf[Int]。所以我尝试将Intval1typeOf[Int]进行比较(尽管我很确定它们是相同的东西)但无济于事。

这里发生了什么?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您应该将类​​型与=:=进行比较,而不是==

documentation说:

  

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