Каков эффект явного указания типа метода generi c apply? - PullRequest
1 голос
/ 10 июля 2020

Мне не очень ясно, как добавление параметра Type к объекту generi c может повлиять на вызов его метода apply. Если это не имело особого смысла, я попытался сформулировать простой пример express моей банальной путаницы.

scala> object Foo {def apply[T] = "Hello from foo"}
object Foo    

scala> Foo
val res0: Foo.type = Foo$@709d6de5

scala> Foo[Int]
val res1: String = Hello from foo

Почему только когда я указываю [Int], метод apply вызывается и возвращает «Hello from foo»

С другой стороны, когда я использую метод apply, который принимает параметр, мне больше не нужно указывать тип.

scala> object Bar {def apply[T](useless: T) = "Hello from bar"}
object Bar

scala> Bar
val res2: Bar.type = Bar$@33089426

scala> Bar("Something useless")
val res3: String = Hello from bar

Почему в первом случае (когда не было параметров) мне нужно было указать тип, а во втором случае (когда был один бесполезный параметр) мне не нужно было указывать тип, чтобы приложение было вызвано?

1 Ответ

6 голосов
/ 10 июля 2020

Компилятору необходимо знать, когда вы ссылаетесь на object и когда вызываете метод apply(). В качестве подсказки он использует [] и / или ().

Если вы добавляете пустой список параметров значения в Foo.apply, вы можете отказаться от спецификации [Int].

scala> object Foo {def apply[T]() = "Hello from foo"}
defined object Foo

scala> Foo
res25: Foo.type = Foo$@332d4c4f

scala> Foo[Int]
res26: String = Hello from foo

scala> Foo()
res27: String = Hello from foo

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

cala> object Baz {def apply = "Hello from Baz"}
defined object Baz

scala> Baz                                                                   
res14: Baz.type = Baz$@5bd4ecec

scala> Baz()                                                                 
<console>:13: error: Baz.type does not take parameters
       Baz()
          ^

scala> Baz.apply                                                             
res16: String = Hello from Baz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...