我有一些类似于以下的代码,其中我有一个函数,它接受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]的隐式转换吗?
答案 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]