2012-01-20 4 views
4

У меня есть код, похожий на следующий, где у меня есть функция, которая принимает List [TypeA], и я хочу, чтобы иметь возможность вызвать ее с помощью List [TypeB], где я имеют неявное преобразование из TypeA в TypeB.Scala неявное преобразование общего аргумента

У меня есть пример кода, который работает, когда я вызываю метод со строкой List, но не работает, если сначала список присваивается переменной.

Вот код, который работает:

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

Я получаю ошибку, что она ожидает получить список [Person], но я 'm дает список [String]

В моем фактическом коде у меня есть список, уже определенный где-то в другом месте, поэтому он не работает. Что я могу сделать, чтобы использовать неявное преобразование из String в Person, и почему оно работает в первом случае, но не во втором?

Примечание стороны: он также работает, если я указать тип списка и это сделать преобразование тогда:

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

Но опять же, это не то, что я хочу.

Действительно ли мне нужно обеспечить неявное преобразование из списка [String] в List [Person]?

+5

вы должны определить метод printAll как: def printAll [T <% Person] (ls: List [T]) = {} – Eastsun

ответ

4

Причины ваш исходный код работает потому, что в printAll(List("1","2","3"))компилятор использует тип вывода знать необходимо, что лицо перед тем он строит список. Эта строка сообщает компилятору, что ему нужен List[Person], который затем заставляет вызов List() возвращать List[Person], который заставляет параметры этого вызова быть Лицом, а затем принудительно использует неявное преобразование из String в Person. К сожалению, заявление val list = List("1","2","3") ничего не говорит о необходимости быть типа List[Person]