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