Surprisingly the case classes in Scala don't follow the recommendation in Chapeter 28, e.g.:
trait Points {}
case class Point( x : Int, y : Int ) extends Points {}
case class Point3D2( override val x : Int, override val y : Int, z : Int ) extends Point( x, y ) {}
val p = new Point( 2, 1 )
val p3D2 = new Point3D2( 2, 1, 0 )
val p23D2 = new Point3D2( 2, 1, 2 )
println( "Option 2e - equals and Point3D2 extends Point (no s)" )
println( p == p )
println( p == p3D2 )
println( p3D2 == p )
println( p3D2 == p3D2 )
println( !(p == p23D2) )
println( !(p3D2 == p23D2) )
Gives:
Option 2e - equals and Point3D2 extends Point (no s)
true
true
false
true
false
true