Не могу найти внутренний класс в Scala - PullRequest
0 голосов
/ 27 ноября 2011

Посмотрите на этот пример:

class Outer(private val handler: Actor){
  def this() = this(new Handler)  // type Handler not found ? ?

 class Handler extends Actor{
    override  def act() {

    }
  }
}

Компилятор жалуется, что класс Handler не найден.Это ошибка?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Внутренний класс Handler имеет ссылку на экземпляр внешнего класса, и вы пытаетесь создать new Handler до того, как внешний экземпляр существует - что невозможно.

Вы можете попробовать что-то вродеэто вместо этого:

class Outer(h: Actor = null) {

  private val handler =
    if (h != null) h
    else new Handler

  class Handler extends Actor {
    override def act() {

    }
  }
}

Если вы беспокоитесь об использовании null, вы можете использовать решение, описанное здесь , чтобы заменить null в значениях по умолчанию для параметров.

2 голосов
/ 27 ноября 2011

Прежде всего вы, наверное, знаете, что доступ к внутренним классам осуществляется через оператор точки (.). Таким образом, доступ к классу Handler должен быть Outer.Handler. Когда вы находитесь в области действия this, компилятор не может найти класс Handler, потому что внутренний класс привязан к внешнему объекту. Здесь все объясняется гораздо лучше: http://www.scala -lang.org / node / 115 . Короче говоря, вы получаете совершенно невозможную ситуацию, потому что внутренний класс скрыт внутри внешнего класса, но фактическое создание экземпляра внешнего класса требует внутреннего класса ...

Думаю, есть много способов ее решить, я просто быстро нарисую один здесь. Поскольку вы, вероятно, хотите, чтобы класс Handler был каким-то образом привязан к Outer, я бы порекомендовал создать и возразить, а затем вызвать класс Outer отсюда. Таким образом, вы получите примерно такой же синтаксис, и все хранится в одном месте. Это может выглядеть примерно так:

class Outer(private val handler : Actor)

object Outer {
  class Handler extends Actor { override def act { } } // The "inner" class
  def apply() = new Outer(new Handler)
  def apply(handler : Actor) = new Outer(handler)
}

Надеюсь, это поможет:)

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