【问题标题】:Scala implicit conversion of a generic argumentScala 隐式转换泛型参数
【发布时间】:2012-01-20 01:42:37
【问题描述】:

我有一些类似于以下的代码,其中我有一个采用 List[TypeA] 的函数,并且我希望能够使用 List[TypeB] 调用它,其中我有从 TypeA 到的隐式转换B型。

我有一些示例代码,当我使用内联列表调用方法时可以使用,但如果先将列表分配给变量,则无法使用。

下面是一些有效的代码:

class Person(val name: String)
implicit def stringToPerson(str: String) : Person = new Person(str)

def printAll(list: List[Person]) {
  list.foreach(person => println("Person: " + person.name))
}

def callIt = {
  printAll(List("1","2","3"))
}

如果 callIt 看起来像这样,不幸的是它不起作用:

def callIt = {
  val list = List("1","2","3")
  printAll(list)
}

我得到一个错误,它需要一个 List[Person] 但我给出一个 List[String]

在我的实际代码中,我已经在其他地方定义了列表,因此它最终无法正常工作。我该怎么做才能让它使用从 String 到 Person 的隐式转换,为什么它在第一种情况下有效,而在第二种情况下无效?

旁注:如果我指定列表的类型并让它进行转换,它也可以工作:

val list: List[Person] = List("1","2","3")

但同样,这不是我想要的。

我真的需要提供从 List[String] 到 List[Person] 的隐式转换吗?

【问题讨论】:

  • 您应该将 printAll 方法定义为: def printAll[T

标签: scala implicit-conversion


【解决方案1】:

您的初始代码工作的原因是因为在printAll(List("1","2","3")) 中,编译器使用类型推断来知道需要Person 它构造列表。该行告诉编译器它需要一个List[Person],然后强制对List() 的调用返回一个List[Person],强制该调用的参数为Person,然后强制使用从String 到Person 的隐式转换.不幸的是,声明 val list = List("1","2","3") 并没有说明需要是 List[Person] 类型的

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多