2017-08-09 58 views
1

我有一些類型的所有亞型

trait Processor[+A] { 
    def handle[B >: A](a: B): Unit 
} 

trait TypeA 

case class A1() extends TypeA 

和方法

def process[A](a: A)(implicit processor: Processor[A]) 

我能有這樣的事情

implicit val processor = new Processor[TypeA] { 
    def handle[B >: TypeA](a: B): Unit = { 
    println(a) 
    } 
} 

,這樣它會處理的TypeA所有亞型隱處理器?例如

process(A1()) 

但對我來說它只是給

scala> process(A1()) 
<console>:29: error: could not find implicit value for parameter processor: Processor[A1] 
       process(A1()) 

回答

1

做什麼的協方差是完全相反的:它意味着一個Processor[A1]Processor[TypeA],所以對於一個類型的處理器可以處理所有的超類型。

因此,如果您需要Processor來處理某個類型的所有子類型,則需要使用反變換。而你的特質長相酷似它實際上應該逆變(但是這可能是由於簡化了問題):

trait Processor[-A] { 
    def handle(a: A): Unit 
} 

implicit val processor: Processor[TypeA] = new Processor[TypeA] { 
    def handle(a: TypeA): Unit = { 
    println(a) 
    } 
} 

然後process(A1())作品。

+0

謝謝。這樣可行 – ntviet18