gpt4 book ai didi

scala - scala 2.8 中的隐式转换问题

转载 作者:行者123 更新时间:2023-12-04 07:29:24 25 4
gpt4 key购买 nike

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

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)。

最佳答案

您只需要使用<:<如果要限制的参数已经绑定(bind)在周围的范围内(因为它们在您的第二次尝试中),那么在您的情况下

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

足够了。

我猜你的第一次尝试没有奏效,因为它对于类型推断器来说太复杂了。

关于scala - scala 2.8 中的隐式转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3389822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com