2010-08-02 65 views
8

我想要寫Tuple2的隱式轉換[A,B]於Seq [C]其中C是超類型A和B. 我的第一次嘗試兩種如下:隱式轉換的Scala中的一個問題2.8

implicit def t2seq[A,B,C](t: (A,B))(implicit env: (A,B) <:< (C,C)): Seq[C] = { 
    val (a,b) = env(t) 
    Seq(a,b) 
} 

但它不工作:

scala> (1,2): Seq[Int] 
<console>:7: error: type mismatch; 
found : (Int, Int) 
required: Seq[Int] 
     (1,2): Seq[Int] 
    ^

雖然這一個工程:

class Tuple2W[A,B](t: (A,B)) { 
    def toSeq[C](implicit env: (A,B) <:< (C,C)): Seq[C] = { 
     val (a,b) = env(t) 
     Seq(a,b) 
    } 
} 
implicit def t2tw[A,B](t: (A,B)): Tuple2W[A,B] = new Tuple2W(t) 

使用案例:

scala> (1,2).toSeq 
res0: Seq[Int] = List(1, 2) 

我不知道爲什麼第一個解決方案沒有按預期工作。 Scala版本2.8.0.r22634-b20100728020027(Java HotSpot TM Client VM,Java 1.6.0_20)。

+2

我認爲'<:<'參數通常被稱爲'ev'(簡稱'證據'),而不是env。 – 2010-08-02 18:34:35

回答

9

你只需要在你的情況下使用<:<如果要限制的參數在周邊範圍內已綁定的(因爲他們是你的第二次嘗試),所以

implicit def t2seq[A <: C,B <: C,C](t: (A,B)) = Seq(t._1, t._2) 

就足夠了。

我想你的第一次嘗試不起作用,因爲它對於類型推理器來說太複雜了。