Невозможно вызвать использование имени класса напрямую для типа карты после добавления сопутствующего проекта - PullRequest
0 голосов
/ 29 ноября 2018

Когда у нас есть класс case, мы вызываем map тип с именем типа, например:

case class Foo(value: String)
val value = Some("Yay!")
val foo = value.map(Foo)

Но если мы также предоставляем объект-компаньон, он перестает работать value.map(Foo) и выглядитвот так работает: value.map(Foo(_)).Почему?

case class Foo(value: String)
object Foo {}
val value = Some("Yay!")
val foo = value.map(Foo)
println(foo)

ScalaFiddle.scala: 5: ошибка: несоответствие типов;
найдено: ScalaFiddle.this.Foo.type
обязательно: scala.this.Function1 [lang.this.String,?]
val foo = value.map (Foo)

1 Ответ

0 голосов
/ 29 ноября 2018

Если вы вообще не определяете object Foo, тогда объект синтетического компаньона имеет следующее объявление:

<synthetic> object Foo 
   extends scala.runtime.AbstractFunction1[String,Foo] 
      with Serializable

Но если вы определите свой собственный object Foo следующим образом

case class Foo(v: String)
object Foo {}

тогда объявление объекта Foo изменяется соответственно на:

object Foo extends scala.AnyRef with Serializable

и больше не extend s Function1.

Метод apply(v: String): Fooвсе еще автоматически генерируется на Foo, но он больше не реализует интерфейс Function1[String, Foo].Если вы объявляете объект-компаньон следующим образом:

object Foo extends (String => Foo) { ... }

, тогда вы снова можете использовать его в выражениях, подобных value.map(Foo).


Синтаксис value.map(Foo(_)) всегда работает, потому что онпросто ярлык для

value.map(x => Foo.apply(x))

и замыкание не заботится о том, какие интерфейсы реализованы Foo, оно заботится только о существовании метода apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...