皮条客在与泛型一起使用时不起作用



请考虑以下代码(脚本(,其中SeqPimps无法更改:

import scala.reflect.ClassTag
implicit class SeqPimps[T: ClassTag](s: Seq[T]) {
  def indexOfOpt(e: T): Option[Int] = s.indexOf(e) match {
    case -1 => None
    case idx => Some(idx)
  }
}
class A[T] {
  val fn = (y: T) => List[T]().indexOfOpt(y)
}
object Main extends App {
  val fn = (y: Int) => List[Int]().indexOfOpt(y)
  println(fn(0))
  println((new A[String]).fn(""))
}
Main.main(args)

它崩溃并显示:

xxx/test.scala:11: error: value indexOfOpt is not a member of List[T]
  val fn = (y: T) => List[T]().indexOfOpt(y)
                               ^
one error found

我的问题:

  • 为什么当显式指定类型时它起作用(在 Main 中,在注释掉 A 并且println它工作正常(并在使用泛型类型时抱怨不存在的成员?呼叫看起来相同。

  • 如何在不修改SeqPimps的情况下修复代码段(例如删除ClassTag - 实际项目中的其他方法需要它(?

请记住,编写class SeqPimps[T: ClassTag](s: Seq[T])实际上告诉编译器添加这样的隐式参数:class SeqPimps[T](s: Seq[T])(implicit ev: ClassTag[T]) .

编译失败是因为无法应用隐式SeqPimps,而无法应用此,因为A中没有隐式ClassTag[T]可用。

几种方法可以在那里添加ClassTag,例如: class A[T : ClassTag] { .将隐式ClassTag传递到何处取决于您和您的用例...

,原来我在类定义中缺少一个ClassTag

class A[T: ClassTag] {

相关内容

最新更新