Ответ на этот вопрос заключается в следующих фактах:
Факт 1: Даже операторы methods
в Scala,
// something like
val a = "abc" == "def"
// is actually
val a = "abc".==("def")
Итак, taskReturningString ==
на самом деле метод taskReturningString.==
Факт 2: methods
можно преобразовать в functions
(с помощью _
),
val string1 = "abc"
val func1 = string1.== _
// func1: Any => Boolean = sof.A$A0$A$A0$$Lambda$1155/266767500@12f02be4
// or if you want more specific type,
val func2: String => Boolean = string1.== _
// func2: String => Boolean = sof.A$A0$A$A0$$Lambda$1156/107885703@19459210
Факт 3: Компилятор Scala является интеллектуальным.Он поддерживает eta-expansion
, который является преобразованием method
в соответствующий function
(чтобы соответствовать требованию) (если возможно).Итак, если мы сообщим компилятору, что нам нужен Function
типа String => Boolean
, и дадим ему метод, он умно преобразует его в функцию.
// so our func3 did not need that explicit conversion using `_`
val func3: String => Boolean = string1.==
// func3: String => Boolean = sof.A$A1$A$A1$$Lambda$1161/1899231632@4843e7f0
Теперь, поскольку ваш taskReturningString
Future[String]
, таким образом, taskReturningString.map
хочет функцию типа String => A
для любого типа A
.
Кроме того, taskReturningString.==
принимает аргумент типа Any
и тип возврата Boolean
,
компилятор расширит его до функции String => Boolean
,
val future1 = Future("abc")
val func4: String => Boolean = future1.==
// func4: String => Boolean = sof.A$A4$A$A4$$Lambda$1237/1577797787@2e682ccb
// And since `func4` will compare the argument string with `future1` for equality
// it will always return `false`
// So what you are doing is actually,
val falseResult: Future[Boolean] = future1.map(func4)