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等类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |