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

Scala 皮条客与泛型一起使用时不起作用,scala,generics,Scala,Generics,考虑以下代码(脚本),其中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 =

考虑以下代码(脚本),其中
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
我的问题是:

  • 当显式指定类型时(在注释掉
    A
    println
    后,在
    Main
    中,它工作得很好),并且在使用泛型类型时抱怨不存在成员,为什么它能工作?电话看起来是一样的

  • 如何在不修改
    SeqPimps
    的情况下修复代码段(例如删除
    ClassTag
    ——这是实际项目中其他方法所必需的)


哦,原来我在类定义中缺少了一个
类标签

class A[T: ClassTag] {

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

class A[T: ClassTag] {

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

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


有几种方法可以在那里添加
ClassTag
,例如:
classa[T:ClassTag]{
。传递隐式
ClassTag
的位置取决于您和您的用例……

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

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

有几种方法可以在那里添加
ClassTag
,例如:
classa[T:ClassTag]{
。传递隐式
ClassTag
的位置取决于您和您的用例