@@ -12,31 +12,31 @@ object EqualityStrawman1 {
12
12
13
13
trait Base {
14
14
def === (other : Any ): Boolean = this .equals(other)
15
- def === [T <: CondEquals ](other : T )(implicit ce : Impossible [T ]): Boolean = ???
15
+ def === (other : Null ): Boolean = this .equals(other)
16
+ def === [T <: EqClass ](other : T )(implicit ce : Impossible [T ]): Boolean = ???
16
17
}
17
18
18
- trait CondEquals extends Base {
19
- def === [T >: this .type <: CondEquals ](other : T )(implicit ce : Eq [T ]): Boolean = this .equals(other)
19
+ trait EqClass [ - U ] extends Base {
20
+ def === [T >: this .type <: EqClass ](other : T )(implicit ce : Eq [T ]): Boolean = this .equals(other)
20
21
def === [T ](other : T )(implicit ce : Impossible [T ]): Boolean = ???
22
+ def === (other : Null ): Boolean = this .equals(other)
21
23
}
22
24
23
- trait Equals [ - T ] extends CondEquals
25
+ case class Str ( str : String ) extends EqClass [_]
24
26
25
- case class Str (str : String ) extends CondEquals
26
-
27
- case class Num (x : Int ) extends Equals [Num ]
27
+ case class Num (x : Int ) extends EqClass [Num ]
28
28
29
29
case class Other (x : Int ) extends Base
30
30
31
- trait Option [+ T ] extends CondEquals
31
+ trait Option [+ T ] extends EqClass [_]
32
32
case class Some [+ T ](x : T ) extends Option [T ]
33
33
case object None extends Option [Nothing ]
34
34
35
35
implicit def eqStr : Eq [Str ] = Eq
36
36
// implicit def eqNum: Eq[Num] = Eq
37
37
implicit def eqOption [T : Eq ]: Eq [Option [T ]] = Eq
38
38
39
- implicit def eqEq [T <: Equals [T ]]: Eq [T ] = Eq
39
+ implicit def eqEq [T <: EqClass [T ]]: Eq [T ] = Eq
40
40
41
41
def main (args : Array [String ]): Unit = {
42
42
val x = Str (" abc" )
@@ -56,6 +56,8 @@ object EqualityStrawman1 {
56
56
Some (x) === z
57
57
None === z
58
58
59
+ Other (3 ) === null
60
+ Str (" x" ) === null
59
61
60
62
def ddistinct [T <: Base : Eq ](xs : List [T ]): List [T ] = xs match {
61
63
case Nil => Nil
0 commit comments