Eas*_*sun 8 scala implicit-conversion scala-2.8
我想写一个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)
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用:
scala> (1,2): Seq[Int]
<console>:7: error: type mismatch;
found : (Int, Int)
required: Seq[Int]
(1,2): Seq[Int]
^
Run Code Online (Sandbox Code Playgroud)
虽然这个工作:
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)
Run Code Online (Sandbox Code Playgroud)
使用案例:
scala> (1,2).toSeq
res0: Seq[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
我不知道为什么第一个解决方案没有按预期工作. Scala版本2.8.0.r22634-b20100728020027(Java HotSpot(TM)Client VM,Java 1.6.0_20).
你只需要使用,<:<
如果要限制的参数已经绑定在周围的范围内(因为它们是你的第二次尝试),所以在你的情况下
implicit def t2seq[A <: C,B <: C,C](t: (A,B)) = Seq(t._1, t._2)
Run Code Online (Sandbox Code Playgroud)
足够了.
我猜你的第一次尝试不起作用,因为它对类型推理器来说太复杂了.
归档时间: |
|
查看次数: |
374 次 |
最近记录: |