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

时间:2017-03-31 07:14:19

标签: 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 = (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 - 实际项目中的其他方法是否需要它?)

2 个答案:

答案 0 :(得分:3)

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

编译失败,因为无法应用隐式SeqPimps,并且无法应用此版本,因为ClassTag[T]内没有隐式A

您可以通过几种方式在其中添加ClassTag,例如:class A[T : ClassTag] {。传递隐含ClassTag的地方取决于您和您的用例......

答案 1 :(得分:0)

哦,事实证明我在课程定义中遗漏了ClassTag

class A[T: ClassTag] {