【问题标题】:Applying implicit generic parameters to a list via ClassTag通过 ClassTag 将隐式泛型参数应用于列表
【发布时间】:2016-11-18 00:02:06
【问题描述】:

我想对列表中的所有对象应用一个函数,其中列表中的所有对象都继承自一个公共类。在这个函数中,我想使用一个implicit 类来确保根据对象的类型应用正确的操作。

例如,我想确保列表中的所有Employee 对象都使用下面的employeeConverter 进行转换。使用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 =&gt; convert(e))) 会有什么不同吗?
  • 他们的打印是无关紧要的 - 这是无法编译的 List(Employee(2) map convert。打印只是为了说明结果。
  • Bob 是对的,由于您使用的语法,编译器根本找不到隐式参数。

标签: list scala types implicit


【解决方案1】:

在这种情况下,编译器需要一些帮助。这有效:

println(List(Employee(2)) map { e => convert(e) })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多