List 为什么将“Nil”定义为“case object”`

List 为什么将“Nil”定义为“case object”`,list,scala,case,null,List,Scala,Case,Null,在scala source中,我发现: case object Nil extends List[Nothing] { ... } 我不明白为什么它被声明为案例对象而不是对象 我发现这个问题[]很有用,我想这个原因是关键: 序列化的默认实现 因为我们经常将数据列表发送给另一个参与者,所以Nil必须是可序列化的,对吗 根据提供的答案(谢谢),我尝试编写一些代码来验证它: trait MyList[+T] object MyNil extends MyList[Nothing] va

在scala source中,我发现:

case object Nil extends List[Nothing] {
    ...
}
我不明白为什么它被声明为
案例对象
而不是
对象

我发现这个问题[]很有用,我想这个原因是关键:

序列化的默认实现

因为我们经常将数据列表发送给另一个参与者,所以Nil必须是可序列化的,对吗


根据提供的答案(谢谢),我尝试编写一些代码来验证它:

trait MyList[+T]

object MyNil extends MyList[Nothing]

val list: MyList[String] = MyNil

list match {
  case MyNil => println("### is nil")
  case _ => println("### other list")
}
您可以看到
MyNil
不是
case对象
,但我仍然可以在模式匹配中使用它。以下是输出:

### is nil

我误解了什么吗?

正如在链接问题的评论中提到的,你得到的是一个更漂亮的
.toString
结果

scala> MyNil.toString
res0: String = MyNil$@51aa572b

scala> case object MyNil2 extends MyList[Nothing]
defined module MyNil2

scala> MyNil2.toString
res2: String = MyNil2

scala> Nil.toString
res1: String = List()

一般来说,对于不可变数据,问题永远不应该是“为什么这是一个case对象(或类)”,而应该是“我能把它变成一个case对象吗?”。除了一些小的例外(主要是由于继承),Scala中的数据元素应该是不可变的,并且应该通过case类/对象实现。有鉴于此,将Nil和::分别作为case对象和case类实现只是标准实践,没有任何缺点