2012-01-20 17 views
4

私はList [TypeA]をとる関数を持っていて、List [TypeB]で呼び出すことができるように、次のようなコードをいくつか持っています。タイプAからタイプBへの暗黙的な変換を有する。スカラーの汎用的な引数の暗黙的な変換

リストのインラインでメソッドを呼び出すと機能するサンプルコードがありますが、リストが変数に割り当てられている場合は機能しません。

ここで働くいくつかのコードです:残念ながら、それはCALLITはこのように見える場合は動作しません

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")) 
} 

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

私はそれがList [人]を期待していることエラーが出るけどリストを提供しています

私の実際のコードでは、リストはすでに別の場所で定義されているので、動作しません。 StringからPersonへの暗黙的な変換を使用するにはどうすればよいのですか。それは最初のケースでは動作しますが、2番目では動作しないのはなぜですか?

サイドノート:私は、リストの種類を指定し、それがその後の変換を行うがあれば、それも動作します:

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

しかし、再び、それは私が欲しいものではありません。

本当にList [String]からList [Person]へ暗黙的に変換する必要がありますか? printAll(List("1","2","3"))コンパイラは、それがリストを構築前に、その人が必要とされている知っている型推論を使用していますので、あなたの最初のコードが動作する

+5

あなたがした方法のprintAllを定義する必要があるタイプであることが必要については何も言いません:DEFのprintAll [T <%パーソン](LS:リスト[T])= {} – Eastsun

答えて

4

理由があります。その行はコンパイラにList[Person]を必要とし、List()への呼び出しを強制的にList[Person]に戻し、その呼び出しのパラメータをPersonにして、StringからPersonへの暗黙の変換を強制します。残念ながら、声明val list = List("1","2","3")List[Person]

関連する問題