比较 Int 和 Double - 没有警告?
Comparing Int to Double - No Warning?
给定以下情况类:
scala> case class Foo(x: Int)
defined class Foo
scala> case class Bar(x: Int)
defined class Bar
编译器在尝试比较不同大小写的实例时显示警告 类。
scala> Foo(5) == Bar(5)
<console>:15: warning: comparing case class values of types Foo and Bar using `==' will always yield false
Foo(5) == Bar(5)
^
res8: Boolean = false
但是下面的对比为什么不给出警告呢?
scala> (5 : Int) == (10 : Double)
res9: Boolean = false
因为==
是Int
的重载方法,其中一个方法接受Double
作为参数类型(Double
和许多其他方法也是如此) .这是 100% 合法的。
abstract def ==(x: Double): Boolean
参见scaladocs。
我猜 res8: Boolean = false
的原因是因为您通过比较 Foo(5) == Bar(5)
来比较对象 Foo and Bar
的实例,因为实例的地址总是不同的并且 false
结果很明显,有警告。 ==
方法在验证之前总是将参数转换为双精度。
这样试试
case class Foo(x: Int)
case class Bar(x: Double)
val a = Foo(5)
val b = Bar(5)
a.x == b.x //res4: Boolean = true
a == b //res5: Boolean = false
给定以下情况类:
scala> case class Foo(x: Int)
defined class Foo
scala> case class Bar(x: Int)
defined class Bar
编译器在尝试比较不同大小写的实例时显示警告 类。
scala> Foo(5) == Bar(5)
<console>:15: warning: comparing case class values of types Foo and Bar using `==' will always yield false
Foo(5) == Bar(5)
^
res8: Boolean = false
但是下面的对比为什么不给出警告呢?
scala> (5 : Int) == (10 : Double)
res9: Boolean = false
因为==
是Int
的重载方法,其中一个方法接受Double
作为参数类型(Double
和许多其他方法也是如此) .这是 100% 合法的。
abstract def ==(x: Double): Boolean
参见scaladocs。
我猜 res8: Boolean = false
的原因是因为您通过比较 Foo(5) == Bar(5)
来比较对象 Foo and Bar
的实例,因为实例的地址总是不同的并且 false
结果很明显,有警告。 ==
方法在验证之前总是将参数转换为双精度。
这样试试
case class Foo(x: Int)
case class Bar(x: Double)
val a = Foo(5)
val b = Bar(5)
a.x == b.x //res4: Boolean = true
a == b //res5: Boolean = false