通过 ClassTag 将隐式通用参数应用于列表
Applying implicit generic parameters to a list via ClassTag
我想将函数应用于列表中的所有对象,其中列表中的所有对象都继承自一个公共 class。在此函数中,我想使用 implicit
class 来确保根据对象的类型应用正确的操作。
例如,我想确保使用下面的 employeeConverter
转换列表中的所有 Employee
对象。直接用 Employee
调用 convert
就可以了,但是将 convert
应用于 Employee
对象列表是编译器错误。
import scala.reflect.ClassTag
object Example {
abstract class Person { def age: Int }
case class Employee(age: Int) extends Person
class Converter[T] { def convert(t: T) = (t,t) }
def convert[T <: Person:ClassTag](p: T)(implicit converter: Converter[T]) =
converter.convert(p)
def main(args: Array[String]): Unit = {
implicit val employeeConverter = new Converter[Employee]()
println(convert(Employee(1)))
//println(List(Employee(2)) map convert) // COMPILER ERROR
}
}
以上代码正确打印了以下内容:
$ scalac Example.scala && scala Example
(Employee(1),Employee(1))
但是,如果我取消注释 COMPILER ERROR
指示的行,我会收到此编译器错误:
Example.scala:20: error: could not find implicit value for parameter converter: Example.Converter[T]
println(l map convert)
^
这个问题可以使用 ClassTag
解决吗?我如何修改此示例以将 convert
应用于列表?
在这种情况下,编译器需要一点帮助。这有效:
println(List(Employee(2)) map { e => convert(e) })
我想将函数应用于列表中的所有对象,其中列表中的所有对象都继承自一个公共 class。在此函数中,我想使用 implicit
class 来确保根据对象的类型应用正确的操作。
例如,我想确保使用下面的 employeeConverter
转换列表中的所有 Employee
对象。直接用 Employee
调用 convert
就可以了,但是将 convert
应用于 Employee
对象列表是编译器错误。
import scala.reflect.ClassTag
object Example {
abstract class Person { def age: Int }
case class Employee(age: Int) extends Person
class Converter[T] { def convert(t: T) = (t,t) }
def convert[T <: Person:ClassTag](p: T)(implicit converter: Converter[T]) =
converter.convert(p)
def main(args: Array[String]): Unit = {
implicit val employeeConverter = new Converter[Employee]()
println(convert(Employee(1)))
//println(List(Employee(2)) map convert) // COMPILER ERROR
}
}
以上代码正确打印了以下内容:
$ scalac Example.scala && scala Example
(Employee(1),Employee(1))
但是,如果我取消注释 COMPILER ERROR
指示的行,我会收到此编译器错误:
Example.scala:20: error: could not find implicit value for parameter converter: Example.Converter[T]
println(l map convert)
^
这个问题可以使用 ClassTag
解决吗?我如何修改此示例以将 convert
应用于列表?
在这种情况下,编译器需要一点帮助。这有效:
println(List(Employee(2)) map { e => convert(e) })