我有一个像这样的隐式类
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没有提供任何提示,所以我很遗憾
答案 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]])