scala 2.8中隐式转换的问题

时间:2010-08-02 16:40:58

标签: scala scala-2.8 implicit-conversion

我想写一个Tuple2 [A,B]到Seq [C]的隐式转换,其中C是A和B的超类型。 我的第一次尝试如下:

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)客户端VM,Java 1.6.0_20)。

1 个答案:

答案 0 :(得分:9)

如果要限制的参数已经绑定在周围范围内(就像在第二次尝试中那样),您只需要使用<:<,所以在您的情况下

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

就足够了。

我猜你的第一次尝试不起作用,因为它对于类型推理器来说太复杂了。