2017-07-21 95 views
2

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

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的类型签名的val1状态,它是一个scala.Int而非typeOf[Int]的类型签名,这是Int。所以我试着将val1typeOf[Int]typeOf[scala.Int]作比较(尽管我很确定他们是同一件事),但都没有效果。

这是怎么回事?有没有解决的办法?

回答

2

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

documentation说:=:

类型相等可以用=进行检查。需要注意的是==不应该用于比较类型的相等性 - ==不能在类型别名的情况下检查类型是否相等,而= = =可以。

+0

哇!我希望解决方案会很简单。谢谢! – Will