By Freewind


2014-06-30 15:46:09 8 Comments

In scala source, I found:

case object Nil extends List[Nothing] {
    ...
}

I can't understand why it is declared as case object rather than object?

I found this question [ Difference between case object and object ] is useful, and I guess this reason is the key:

default implementations of serialization

because we often send list of data to another actor, so Nil must be serializable, right?


With the provided answers(thanks), I try to write some code to verify it:

trait MyList[+T]

object MyNil extends MyList[Nothing]

val list: MyList[String] = MyNil

list match {
  case MyNil => println("### is nil")
  case _ => println("### other list")
}

You can see MyNil is not case object, but I can still use it in pattern matching. Here is the output:

### is nil

Do I misunderstand something?

2 comments

@Dave Griffith 2014-06-30 22:24:15

In general for immutable data, the question should never be "why is this a case object (or class)" but rather "Can I make this a case object?". With a few small exceptions (mostly due to inheritance), data elements in Scala should be immutable, and should be implemented via case classes/objects. Given that, implementing Nil and :: as a case object and case class (respectively) is just standard practice, for which there is no downside.

@soldier.moth 2014-06-30 19:45:37

As mentioned in the comments of that linked question, one thing you get is a prettier .toString result

scala> MyNil.toString
res0: String = [email protected]

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

scala> MyNil2.toString
res2: String = MyNil2

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

Related Questions

Sponsored Content

21 Answered Questions

11 Answered Questions

[SOLVED] OR is not supported with CASE Statement in SQL Server

6 Answered Questions

[SOLVED] Referring to the null object in Python

  • 2010-07-20 11:53:41
  • Lizard
  • 1700348 View
  • 1225 Score
  • 6 Answer
  • Tags:   python null

20 Answered Questions

[SOLVED] How to Sort a List<T> by a property in the object

27 Answered Questions

[SOLVED] Why not inherit from List<T>?

10 Answered Questions

[SOLVED] Why is it string.join(list) instead of list.join(string)?

  • 2009-01-29 22:45:13
  • Evan Fosmark
  • 1300863 View
  • 1805 Score
  • 10 Answer
  • Tags:   python string list

8 Answered Questions

[SOLVED] How to sort a list of objects based on an attribute of the objects?

1 Answered Questions

[SOLVED] Scala, Akka: pattern matching for object in trait issue

  • 2017-06-15 22:49:30
  • Mikekekeke
  • 140 View
  • 0 Score
  • 1 Answer
  • Tags:   scala akka

2 Answered Questions

[SOLVED] Why are case objects serializable and case classes not?

Sponsored Content