2017-07-21 141 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