Вопрос по java – Статические внутренние классы в скале

36

Какой аналог в Scala делает это на Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

Я специально хочу, чтобы мой внутренний классnot должен иметь полное имя - т.е. я хочуTrade.TypeнеTradeType, Так что в Scala я представлял, что это может быть что-то вроде:

class Outer(val inner: Inner) {
    object Inner
}

Но это, похоже, не работает: моя скалаInner просто не виден снаружиOuter учебный класс. Одним из решений, конечно, будет:

class Inner
class Outer(val inner: Inner)

Что нормально - но из-за названий моих классов,Inner действительно является "типом" изOuter а такжеOuter на самом деле имеет длинное имя. Так:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

Что многословно и ужасно. Я мог бы заменитьSomeHorriblyLongNameType простоType но тогда не было бы очевидной связи между ним и классом, с которым он был связан. фу

Ваш Ответ

5   ответов
6

Из скала-ланга:

there is no notion of 'static' members in Scala. Instead, Scala treats static members of class Y as members of the singleton object Y

Таким образом, кажется, вы можете иметь класс, определенный внутри объекта, но не статический класс, определенный внутри класса.

Я расширил исходную информацию oxbow_lakes
Если вы объявляете объект внутри класса в Scala, он не виден снаружи этого класса (или я не могу понять, как это сделать). Ваш ответ не совсем то, что я спрашивал: я спрашивал, как я могу что-то сделать в Scala, в отличие от вопроса о том, как Scala будет относиться к статике Java. oxbow_lakes
1

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

case class C(var x: Int)
class A { case object b extends C(0) }
val a = new A
println(a.b.x)
a.b.x = 2
println(a.b.x)

Более того, вы можете полностью переопределить родительский val с помощью объекта:

case class C(var x: Int)
class A { val y: C = C(0) }
class B extends A { override case object y extends C(2) }
val a: A = new B
println(a.y.x)
36

если вам не нужен доступ к внешнему классу во внутреннем классе (что не было бы в Java, учитывая, что ваш внутренний класс был объявлен).static):

object A{
    class B {
        val x = 3
    }
}
class A {
    // implementation of class here
}
println(new A.B().x)
1

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

class A {
}

object A {
    def xpto // define some pseudo static methods here..
}

Тогда вы можете просто использоватьA.xpto.
Попробуйте прочитать больше о дополнительных модулях на Scala

25

«статический» классы должны быть размещены внутри объекта-компаньона.

В Scala классы, признаки и объекты, которые являются членами класса, зависят от пути. Например:

class Button {
  class Click
}


val ok = new Button
val cancel = new Button

val c1 = new ok.Click
val c2 = new cancel.Click

Теперь c1 и c2 являются экземплярами классов -different-. Один класс в порядке. Нажмите, а другой отменить. Нажмите. Если вы хотите сослаться на тип всех классов Click, вы можете сказать Button # Click.

Этот класс является внутренним, но не статичным

Похожие вопросы