scala中有一个特殊的问题,每次都会咬我。每它咬我的时候,它就咬很辛苦......斯卡拉平等:为什么这个代码编译?
为什么这行编译
val x = "10"
if (x != 10) {
print("do something")
}
此行编译和执行,但对于像斯卡拉一个“类型安全”的语言......这行应导致编译错误
scala中有一个特殊的问题,每次都会咬我。每它咬我的时候,它就咬很辛苦......斯卡拉平等:为什么这个代码编译?
为什么这行编译
val x = "10"
if (x != 10) {
print("do something")
}
此行编译和执行,但对于像斯卡拉一个“类型安全”的语言......这行应导致编译错误
因为所有类型的祖先都是Any,并且Any定义了方法!=
。见http://www.scala-lang.org/api/current/index.html#scala.Any
所以编译器向后弯曲,使你的代码编译,并且上升的String("10")
类型层次结构,直到它发现需要一个整数
模式匹配给你一个多一点帮助!=
的实现。
scala> val i = 17
i: Int = 17
scala> "42" match { case `i` => }
<console>:13: error: type mismatch;
found : Int
required: String
"42" match { case `i` => }
^
scala> case class C(i: Int)
defined class C
scala> 42 match { case C(_) => }
<console>:14: error: constructor cannot be instantiated to expected type;
found : C
required: Int
42 match { case C(_) => }
^
你应该看看scalaz'==='运算符来得到你想要的。 http://stackoverflow.com/a/30243825/4080476 –
你为什么认为它不应该编译? '10'不等于'“10”',所以你得到的结果是正确的。为什么你认为应该不可能比较不同类型的对象? – Dima
'=='只是一种方法,而不是操作符,你会如何做到这一点? –