Scala与类型检查相等?

时间:2012-01-31 17:53:54

标签: scala operators equality

是否有统一的方法来执行类型检查的相等性? 不幸的是

val objectA:String = "test"
val objectB:Int = 2
objectA == objectB

如果objectB是一个Int,而者objectA是一个String,则等于运算符==不会抱怨。 我需要一个像===这样的运算符来执行类型检查(我希望它对所有scala obj都是统一的)。这样的运营商存在吗?

3 个答案:

答案 0 :(得分:14)

你需要查看scalaz===类型安全等号 - 它在那里实现为类型类。

你也可以通过Heiko Seeberger观看谈话,在那里他描述了如何实施:

http://days2011.scala-lang.org/node/138/275

您还可以在此处找到一些示例:

http://scalaz.github.com/scalaz/scalaz-2.9.1-6.0.4/doc.sxr/scalaz/example/ExampleEqual.scala.html#24187

(在示例中,他们使用方法,但它只是===的别名

答案 1 :(得分:8)

Scalaz提供了这样的运营商。

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> 4 === "Scala"
<console>:14: error: type mismatch;
 found   : java.lang.String("Scala")
 required: Int
              4 === "Scala"
                    ^

scala> 4 === 4
res7: Boolean = true

scala> 4 === 5
res8: Boolean = false

答案 2 :(得分:2)

这也是ScalaUtils库提供的:

import org.scalautils.TypeCheckedTripleEquals._

scala> "Scala" == Some("Scala")
res1: Boolean = false

scala> "Scala" === Some("Scala")
<console>:11: error: types String and Some[String] do not adhere to the type
  constraint selected for the === and !== operators; the missing implicit 
  parameter is of type org.scalautils.Constraint[String,Some[String]]
              "Scala" === Some("Scala")
                      ^