Как создать внутренние классы за один шаг в Scala? - PullRequest
10 голосов
/ 11 ноября 2011

Рассмотрим этот код:

class Outer {
  class Inner
}

В Java можно было бы создать экземпляр Inner с:

Outer.Inner inner = new Outer().new Inner();

Я знаю, что могу написать это в Scala:

val outer = new Outer
val inner = new outer.Inner

Но мне интересно, можно ли выразить то же самое без присвоения outer.

Оба

new Outer.new Inner  

и

new (new Outer).Inner

не принимаются компилятором.

Что-то мне не хватает?

Ответы [ 2 ]

23 голосов
/ 11 ноября 2011

Прежде всего, я сомневаюсь, что создание экземпляра за один раз имеет какое-либо значение - вы все равно, что выбросить экземпляр Outer, не ссылаясь на него.Меня удивляет, если бы вы не думали о статическом внутреннем классе Java, как

public class Outer() {
   public static class Inner() {}
}

, который в Scala будет переводиться в Inner, являющийся внутренним классом Outer s companion object:

object Outer {
    class Inner
}

new Outer.Inner

Если вы действительно хотите внутренний зависимый класс и вам просто нужен более удобный синтаксис для его создания, вы можете добавить сопутствующий объект дляэто :

class Outer {
   object Inner {
      def apply() = new Inner()
   }
   class Inner
}

new Outer().Inner()
0 голосов
/ 16 декабря 2014

Если у вас есть класс, объявленный так:

class Outer {
  class Inner
}

, то вам нужно сначала создать экземпляр внешнего класса, а затем создать экземпляр внутреннего класса следующим образом:

val outerTest = new Outer()
val innerTest = new outerTest.Inner()

теперь вы можете вызывать внутреннийметоды класса с использованием переменной innerTest.

...