Ответ 1
Хорошо, начнем с начала, почему он не работает в первом случае:
- Вы пытаетесь определить неявный метод, который преобразует
String
вInt
, и для этого вы вызываетеtoInt
. - К сожалению,
toInt
не является частью классаString
. Таким образом, компилятор должен найти неявное преобразованиеstr
в то, что имеет методtoInt:Int
. - К счастью,
Predef.augmentString
преобразуетString
вStringOps
, который имеет такой метод. - Но тип
Int
также имеет такой метод, и если вы определяете тип возврата, методstrToInt2
можно вызывать рекурсивно, а поскольку метод неявный, его можно применить для преобразования чего-либо с помощьюtoInt:Int
. - Компилятор не знает, какой неявный метод использовать (между вашими и
Predef.augmentString
и выдает ошибку.
Во втором случае, когда вы опускаете возвращаемый тип, функция strToInt2
не может быть рекурсивной, и больше нет двух кандидатов для преобразования String
.
НО, если после этого определения вы попытаетесь: "2".toInt
, ошибка вернется: теперь у вас есть два способа получить что-то с помощью функции toInt:Int
, если у вас есть String
.