2012-01-20 193 views
4

我有一些類似於下面的代碼,其中我有一個函數,它需要一個List [TypeA],我想能夠用List [TypeB]調用它,其中I有從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) 
} 

我得到它需要一個列表[人]但我的錯誤'給出一個列表[字符串]

在我的實際代碼中,我已經在其他地方定義了列表,所以它不會結束工作。我能做些什麼來讓它使用從String到Person的隱式轉換,爲什麼它能在第一種情況下工作,而不是在第二種情況下工作?

旁註:

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

但同樣,這不是我想要的:如果我指定列表的類型,並將它進行轉換,然後它也適用。

我真的需要提供從List [String]到List [Person]的隱式轉換嗎?

+5

您應該將方法printAll定義爲:def printAll [T <%Person](ls:List [T])= {} – Eastsun

回答

4

您最初的代碼工作的原因是因爲在printAll(List("1","2","3"))編譯器使用類型推斷知道的是需要一個人就構建列表之前。該行告訴編譯器它需要一個List[Person],然後強制呼叫List()返回List[Person],強制該調用的參數爲Person,然後強制使用從String到Person的隱式轉換。不幸的是,語句val list = List("1","2","3")沒有說明需要的類型List[Person]