2013-10-20 47 views
1

我使用類型約束來說類型AB必須相同。在下面,我被允許隱含地從A投到B,但需要明確演員從BA。什麼是正確的方法來做到這一點?相等的類型約束需要顯式轉換

class Pair[A, B](var first: A, var second: B) { 
    def swap()(implicit ev: A =:= B) { 
    val tmp = second 
    second = first 
    first = tmp //won't compile without appending .asInstanceOf[A] 
    } 

    /* 
    ...other methods like replaceFirst, replaceSecond that 
    don't require types A, B to be the same 
    */ 
} 

回答

2

A =:= B見證A類型等於輸入B。然後你必須告訴編譯器B類型是等於A類型。與B =:= A :)

執行此請參見下面介紹新ev2參數:

class Pair[A, B](var first: A, var second: B) { 
    def swap()(implicit ev: =:=[A,B], ev2: =:= [B,A]) { 
    val tmp = second 
    second = first 
    first = tmp 
} 

BTW:一些人建議:「只使用一種類型參數」。如果按照這種方式進行操作,您將無法定義其他方法/函數,但不需要此類約束。