Scala隐式转换泛型参数

时间:2012-01-20 01:42:37

标签: scala implicit-conversion

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

我有一些示例代码,当我使用List inline调用该方法时,但是如果首先将列表分配给变量,则该代码不起作用。

这里有一些有用的代码:

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]的隐式转换吗?

1 个答案:

答案 0 :(得分:4)

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