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

Scala视图边界与子类型一起使用?

发布时间:2020-12-16 18:27:48 所属栏目:安全 来源:网络整理
导读:Scala中有什么像视图绑定但可以匹配子类型? 由于Scala中的视图不链接,我目前有以下内容: implicit def pimpIterable[A,I[_]](x: I[A])(implicit f: I[A] = Iterable[A]) = new { def mylength = x.size } 让我写: Array(1,2,3).mylengthSeq(1,3).mylength
Scala中有什么像视图绑定但可以匹配子类型?

由于Scala中的视图不链接,我目前有以下内容:

implicit def pimpIterable[A,I[_]](x: I[A])(implicit f: I[A] => Iterable[A]) =
  new { def mylength = x.size }

让我写:

Array(1,2,3).mylength
Seq(1,3).mylength

上面的表单似乎是必要的,因为如果我尝试用以下内容简化我的函数签名:

implicit def pimpIterable[A,I <% Iterable[A]](x: I) =
  new { def mylength = x.size }

那么隐式转换对数组不起作用,因为没有从Array到Iterable的直接视图(只有Iterable的子类,第一种形式能够找到).

这也迫使所有其他短手也以长篇形式写出来.可能是什么:

implicit def pimpIterable[A: Scalar,I <% Iterable[A]](x: I) = ...

现在必须写成:

implicit def pimpIterable[A,I[_]](x: I[A])(implicit f: I[A] => Iterable[A],m: Scalar[A]) = ...

有没有更好的办法?

解决方法

视图绑定签名有两个问题.首先,Iterable没有长度,只有大小.接下来,我不是类型cosntructor.因此,修复两者,签名是:

implicit def pimpIterable[A,I <% Iterable[A]](x: I) = new { def mylength = x.size }

这是正确的.如果参数化I,它将排除BitSet和String等类型.

(编辑:李大同)

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

    推荐文章
      热点阅读