2014-05-25 4 views

risposta

13

Utilizzando la risposta di Miles Sabin here:

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 

poi:

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] = [email protected] 


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] 
+1

Is A = = B pari a = = [A, B]!? E possiamo usare A AnyName B invece di AnyName [A, B]? – cloud

+0

@cloud Sì, 'A =! = B' è uguale a' =! = [A, B] '; si noti che questo è simile alle due sintassi per i metodi di chiamata, la sintassi "operatore" e la sintassi "normale". – Jesper

+2

Sarebbe bello se fosse possibile ottenere un messaggio di errore migliore rispetto ai confusi "valori impliciti ambigui". – Jesper

Problemi correlati