隐式类中的泛型

时间:2017-12-01 21:35:00

标签: scala

我有一个像这样的隐式类

  private[this] implicit class OptionListUtil[A, B <: List[A]](option: Option[B]) {

      def defaultMap[C](f: A => C): Seq[C] = option.getOrElse(Seq.empty[A]).map(f)

但是当我继续在Option [List [A]]上调用它时,我得到的值defaultMap不是Option [List [A]]的成员

Intellij没有提供任何提示,所以我很遗憾

3 个答案:

答案 0 :(得分:4)

通常情况下,如果类型参数只出现一次,就会出现疑问。在这种情况下,B实际上是无用的,您可以将OptionListUtil简化为

private[this] implicit class OptionListUtil[A](option: Option[List[A]]) {
  def defaultMap[C](f: A => C): Seq[C] = option.getOrElse(Seq.empty[A]).map(f)
}

因为Option是协变的。对于要处理的类型推断,这要简单得多。

答案 1 :(得分:0)

改为:

implicit class OptionListUtil[A,B](option: Option[B])(implicit ev: B <:< List[A]) {

  def defaultMap[C](f: A => C): Seq[C] = option.toSeq.flatMap(_.map(f))
}

当前的scala编译器无法正确推断A中的B <: List[A]类型。在这些情况下询问<:<的隐式证据有助于编译器进行类型推断。我读到一些新的dotty编译器显然没有这个问题。

答案 2 :(得分:0)

看起来另一种解决这个问题的方法是使用类别签名更高的kinded泛型:

private[this] implicit class OptionListUtil[A, B[A] <: List[A]](option: Option[B[A]])