Компаньон Scala с чертой против абстрактного класса из кода Java - PullRequest
0 голосов
/ 02 июля 2018

Мы можем определить сопутствующий объект Scala для абстрактного класса:

object CompanionAbstractClass {
  def newInstance():CompanionAbstractClass = CACChild("companion abstract class")
}
//sealed trait TestQ{
sealed abstract class CompanionAbstractClass{
  val name:String
}
case class CACChild(name:String) extends CompanionAbstractClass

Из кода Scala я могу использовать его как:

val q1 = CompanionAbstractClass.newInstance.name

Из кода Java его можно использовать как:

CompanionAbstractClass.newInstance().name();

Для лучшей композиции в Scala мы предпочитаем использовать черты:

object CompanionTrait {
  def newInstance():CompanionTrait = CTChild("companion trait")
}
sealed trait CompanionTrait {
  val name:String
}
case class CTChild(name:String) extends CompanionTrait

Из Scala его можно использовать аналогично ранее:

CompanionTrait.newInstance().name

Но теперь из Java я не могу вызвать его так же, как:

CompanionTrait.newInstance().name();

Я могу сделать это только через:

CompanionTrait$.MODULE$.newInstance().name();

Чтобы улучшить предыдущий синтаксис и избавиться от этого "$", я могу создать оболочку в Scala или Java (что не очень хорошо для моего варианта):

object CompanionTraitFactory {
  def newInstance():CompanionTrait = CompanionTrait.newInstance()
}

Теперь из Java я могу использовать его также как:

CompanionTraitFactory.newInstance().name();

Не могли бы вы объяснить, почему в случае, если для признака определен объект-компаньон, я не могу использовать его из Java способами, как его можно использовать, если он определен либо для абстрактного класса (CompanionAbstractClass case), или даже как обычный синглтон (CompanionTraitFactory чехол). Ребята, я более или менее понимаю разницу между чертами скалы и абстрактными классами. Я хочу понять, , почему он был реализован таким образом и , есть ли вероятность, что он будет поддерживаться в Scala в будущем .

1 Ответ

0 голосов
/ 02 июля 2018

В рабочем случае вы вызываете статический перенаправитель, добавленный к вашему абстрактному классу. Вы не привыкли к статическому переадресации на вашем интерфейсе, но вы делаете это в 2.12.

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