加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala 2.8中隐式转换的问题

发布时间:2020-12-16 08:58:00 所属栏目:安全 来源:网络整理
导读:我想写一个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: er
我想写一个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,C)): Seq[C] = {
        val (a,b) = env(t)
        Seq(a,b)
    }
}
implicit def t2tw[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).

解决方法

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

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

足够了.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读