我有一个类型:
class σ
现在我要定义一个类型:
class υ[τ <: σ]
附加要求τ≠σ。
这有可能吗?
我有一个类型:
class σ
现在我要定义一个类型:
class υ[τ <: σ]
附加要求τ≠σ。
这有可能吗?
使用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
然后 :
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]
使用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
然后 :
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]