2017-01-07 2 views
1
scala> val a1 = scala.concurrent.Promise[Int] 
a1: scala.concurrent.Promise[Int] = [email protected] 

Я не могу понять, как создается экземпляр DefaultPromise выше. Вполне понятно, что в приведенном ниже примере, () делает вызов apply() и DefaultPromise создаетсяScala - Типы и активация

scala> val a2 = scala.concurrent.Promise[Int]() 
a2: scala.concurrent.Promise[Int] = [email protected] 

ответ

3

Я не в состоянии понять, как создается выше

экземпляр DefaultPromise С вы явно передаете параметр типа ([Int]) в вызов (спасибо @Jasper для пояснения), компилятор рассматривает вызов так, как если бы вы вызвали Promise.apply[Int](), поскольку объект не может иметь параметр типа.

Мы можем ознакомиться с этим описанием кода. Если мы называем Promise[Int], компилятор interpets:

private[this] val res2: scala.concurrent.Promise[Int] = scala.concurrent.Promise.apply[Int](); 

С другой стороны, если мы не поставляем параметр типа, мы получаем Promise.type:

private[this] val res3: concurrent.Promise.type = scala.concurrent.Promise; 
+0

Если опустить скобки, объект-компаньон (если таковой существует) будет присвоен переменной. Если сопутствующий объект не существует, произойдет ошибка компиляции. Он не создает экземпляр, если мы опускаем скобки. Например, если существует класс 'Person' и объект-компаньон' Person', 'val a = Person' приведет к' a: Person.type = Person $ @ 51c693d'. Это отличается от 'val b = new Person', что приведет к' b: Person = Person @ 1efe439d' –

+1

Вы передаете параметр типа ('Int') методу' apply'. Вот как компилятор знает, что вы вызываете 'apply'; объект не имеет параметров типа. –

+0

@ Jasper-M Спасибо. Не могли бы вы объяснить немного подробнее - может быть с примером или ссылкой на него? –

Смежные вопросы