我正在使用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]
。所以我尝试将Int
与val1
和typeOf[Int]
进行比较(尽管我很确定它们是相同的东西)但无济于事。
这里发生了什么?有办法解决这个问题吗?
答案 0 :(得分:3)
您应该将类型与=:=
进行比较,而不是==
。
可以使用=:=检查类型等式。重要的是要注意,==不应该用于比较类型的相等性 - ==在类型别名的情况下不能检查类型相等,而=:= can。