2014-04-22 96 views
0

我想要實現這個較低的類型綁定答:斯卡拉:無單

implicit def aConvertable(obj: A): B = new B(obj) 
implicit def aConvertableWithoutB[T <: A without B](obj: T): C = new C(obj) 

什麼是正確的方式說:「一個沒有B」?

+0

我很想知道爲什麼你需要這個。 –

+1

你可能會在這裏找到一些提示或線索(這是一個引人入勝的閱讀!):http://www.chuusai.com/2011/06/09/scala-union-types-curry-howard/ –

+0

甚至更​​好:http ://stackoverflow.com/questions/6909053/enforce-type-difference –

回答

1

我假設B是A的一個子類型。技巧是引入一個適用於所有A的隱式「AllowedConversion」特徵,然後爲B具有相同類型的兩個隱式實例,重新曖昧B:

object Foo { 

    trait A 
    class B(a: A) extends A 

    class C(a: A) 


    class AllowedConversion[T] 

    implicit def allowedForAs[T<:A] = new AllowedConversion[T] 
    implicit def contradictoryForBs[T <: B] = new AllowedConversion[T] 
    implicit def contradictoryForBs2[T <: B] = new AllowedConversion[T] 


    implicit def aConvertable(obj: A): B = new B(obj) 
    implicit def aConvertableWithoutB[T <: A](obj: T)(implicit allowed: AllowedConversion[T]): C = new C(obj) 

    // error! 
    // new B(new A{}):C 

    // ok! 
    new A{}:C 

}