Mar*_*rth 13

在这里使用Miles Sabin的答案:

trait =!=[A, B]

implicit def neq[A, B] : A =!= B = null
implicit def neqAmbig1[A] : A =!= A = null
implicit def neqAmbig2[A] : A =!= A = null
Run Code Online (Sandbox Code Playgroud)

然后 :

scala> class A
defined class A

scala> class B[C <: A](implicit ev: C =!= A)
defined class B

scala> class D extends A
defined class D

scala> new B[D]()       // OK, D is a subtype of A
res4: B[D] = B@4d8c463c


scala> new B[A]()       // Error, A =:= A
<console>:15: error: ambiguous implicit values:
   both method neqAmbig1 of type [A]=> =!=[A,A]
   and method neqAmbig2 of type [A]=> =!=[A,A]
   match expected type =!=[A,A]

scala> class E
defined class E

scala> new B[E]()       // Error, E is not a subtype of A
<console>:15: error: type arguments [E] do not conform to class B's type parameter bounds [C <: A]
Run Code Online (Sandbox Code Playgroud)

  • 如果有可能获得比混乱的"模糊隐含值"更好的错误消息,那将是很好的. (2认同)