Scala неявное преобразование универсального аргумента - PullRequest
4 голосов
/ 20 января 2012

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

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

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

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 Ответ

4 голосов
/ 20 января 2012

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

...