13

私は Akka 関連の typesafe アクティベーター コードを調べており、次の構造に興味をそそられました。

コンパニオン オブジェクト:

object MarkerActor {
  sealed trait MarkerMessage
  case object Stop extends MarkerMessage
   ..
  def objectMethod = print("hi from companion object")
}

Companion クラス:コンパニオン オブジェクト メソッドをインポートします。

class MarkerActor extends Actor with ActorLogging {
    import MarkerActor._   // Comment this line to compare w or w/o import available

    objectMethod  // just to see if 'visible' within companion class

    override def receive = {
      case Stop => {

だから..それは少し驚くべきことです。クラスがオブジェクトメソッドを自動的に「見る」ことを可能にするコンパニオンクラス/オブジェクト間に「特別な関係」がないのはなぜですか?

更新 私はこれに少し懐疑的だったので、先に進んで「import MarkerActor._」をコメントアウトしました。これにより、Companion クラスで「Symbol not found: Stop」エラーが発生しました。だから..インポートは本当に必要です。

4

1 に答える 1

20

数年前、すべてのコンパニオン オブジェクト メンバーを親クラスに暗黙的にインポートするかどうかについての議論がありました。当時の決定は、不要なものを削除するよりも追加のインポートを追加する方が簡単であるため、明示的なインポートを要求することでした。ここに完全な議論があります。

于 2014-05-18T23:28:58.457 に答える