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

scala – 泛型类的子类型的隐式类

发布时间:2020-12-16 18:45:22 所属栏目:安全 来源:网络整理
导读:我想用一些自定义代码增强所有Iterables. 为此,我写了以下内容: implicit class RichIterable[A,B : Iterable[A]](b: B) { def nonEmptyOpt: Option[B] = if (b.nonEmpty) Some(b) else None} 现在,当我想在List上使用这个方法时,肯定是Iterable的子类,就像
我想用一些自定义代码增强所有Iterables.
为此,我写了以下内容:

implicit class RichIterable[A,B <: Iterable[A]](b: B) {
  def nonEmptyOpt: Option[B] = if (b.nonEmpty) Some(b) else None
}

现在,当我想在List上使用这个方法时,肯定是Iterable的子类,就像这样

List(1,2,3).nonEmptyOpt

我明白了

value nonEmptyOpt is not a member of List[Int]

我该如何解决这个问题?

解决方法

给定仅具有类型B<:Iterable [A]的参数,编译器不知道如何容易地弄清楚A是什么,因为它不一定容易从B计算(需要搜索至少上限). 相反,您可以通过重新定义类型约束来实现此目的,而无需使用技巧.本质上,B应该是一个由Iterable限制的类型构造函数.然后,你的隐式类是从一些B [A]到你的丰富类的转换.具有B [A]参数有助于编译器计算A,因为它期望它是类型构造函数B的参数.

implicit class RichIterable[A,B[X] <: Iterable[X]](b: B[A]) {
  def nonEmptyOpt: Option[B[A]] = if (b.nonEmpty) Some(b) else None
}

scala> List(1,3).nonEmptyOpt
res0: Option[List[Int]] = Some(List(1,3))

scala> List.empty[Int].nonEmptyOpt
res1: Option[List[Int]] = None

(编辑:李大同)

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

    推荐文章
      热点阅读