scala案例类等于(=)未按预期工作

scala案例类等于(=)未按预期工作,scala,equality,case-class,Scala,Equality,Case Class,我一定是错过了什么傻事。我有这个: case class Color(val rgb:Int) { private val c = rgb - 0xff000000 val r = (c & 0xff0000) >> 16 val g = (c & 0x00ff00) >> 8 val b = (c & 0x0000ff) } case object Red extends Color(0xffff0000) case o

我一定是错过了什么傻事。我有这个:

case class Color(val rgb:Int) {
   private val c = rgb - 0xff000000
   val r = (c & 0xff0000) >> 16
   val g = (c & 0x00ff00) >> 8
   val b = (c & 0x0000ff)
}

case object Red extends Color(0xffff0000)
case object Green extends Color(0xff00ff00)
case object Blue extends Color(0xff0000ff)
然后我希望这会打印出true

val c = Color(0xff00ff00)
println(c == Green)

为什么不呢?

从Case类继承Case类(或对象)是一种不好的做法,从Scala 2.9.1开始是非法的。使用
对象
而不是
案例对象
来定义
红色
绿色
蓝色

为什么会这样?Green是一个伴生对象,c是一个实例。它们不相等。

我认为这是一个相关的问题:“为什么它扩展的case对象和case类不相等”

使用Scala 2.12.2

我在您的示例中添加了以下行,现在object等于类实例

object Black extends Color(0x00000000)
val black1 = Color(0x00000000)
black1 == Black

res1:Boolean=true

case object create
等于
hashcode
apply/unapply
。为什么这是一种不好的做法?@Amir Raminfar:不,实际上在这种情况下不是这样,因为这些方法已经存在于
Color
上,而
case
只会在这些方法尚未被覆盖的情况下创建它们@4e6:如果您仍然从case类继承,则使用
对象
case对象
并不重要!啊,你的意思是把一个案例分类。我认为你应该改变措辞,因为听起来你好像在说使用
case objects
通常是不好的。@Alexey Romanov,问题是案例间的继承性。如果一个非case对象从case类继承,则没有关系。我更新了答案来澄清这一点。谢谢,@kipton。这就是我的意思。这是一个案例间继承的bug,现在是非法的。当从对象中删除case修饰符时,代码会起作用,因为case类上的
==
定义会检查参数的相等性(这里,
rgb
)。顺便说一下,
Green
不是class
Color
的伴生对象。伴随对象需要与trait/类具有相同的名称,并且(我认为)需要在同一个文件中定义。关于为什么伴生对象有用的更多信息:另一个提示:
Color
的参数中的
val
是多余的,因为
Color
是一个case类。可以这样说:
case-class-Color(rgb:Int)
是的,这是一个很晚才添加的颜色,因为我正试图让它像我预期的那样工作;既然你提到了,我记得不需要了。