【问题标题】:Int Type vs scala.Int TypeInt 类型与 scala.Int 类型
【发布时间】:2017-07-22 17:23:26
【问题描述】:

我正在使用 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

SimpleCaseval1 的类型签名表明它是scala.Int 而不是typeOf[Int] 的类型签名,即Int。所以我尝试将val1typeOf[Int]typeOf[scala.Int] 进行比较(尽管我很确定它们是同一个东西)但无济于事。

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

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

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

    documentation 说:

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

    【讨论】:

    • 哇!我希望解决方案就这么简单。谢谢!
    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 2011-03-31
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多