Pergunta

O que é o análogo no Scala de fazer isso em Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

Eu quero especificamente minha classe interna para não tem que ter um nome totalmente qualificado - ou seja, eu quero Trade.Type, não TradeType. Assim, em Scala eu imaginava que poderia ser algo como:

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

Mas isso não parece trabalho: meu scala Inner apenas parece não ser visível do exterior da classe Outer. Uma solução seria, evidentemente:

class Inner
class Outer(val inner: Inner)

O que é OK - mas por causa dos nomes de minhas aulas, Inner é realmente o "tipo" do Outer e Outer realmente tem um nome longo. Assim:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

O que é detalhado e horrível. Eu poderia substituir SomeHorriblyLongNameType com apenas Type mas haveria então nenhuma conexão óbvia entre ele e a classe que foi relacionado. Ufa

Foi útil?

Solução

Você pode fazer algo assim se não precisa de acesso à classe externa na classe interna (que você não teria em Java dada static que a sua classe interna foi declarado):

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

Outras dicas

Como outros apontaram, aulas de "estático" deve ser colocado dentro do objeto companheiro.

Em Scala, classes, traços e objetos que são membros de uma classe são dependentes do caminho. Por exemplo:

class Button {
  class Click
}


val ok = new Button
val cancel = new Button

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

Agora c1 e c2 são instâncias de classes -different-. Uma classe é ok.Click, eo outro é cancel.Click. Se você queria para se referir ao tipo de todas as classes clique, você poderia dizer o botão # Click.

De scala-lang :

não há nenhuma noção de membros 'estáticos' em Scala. Em vez disso, Scala guloseimas membros estáticos de classe Y como membros do objecto Singleton Y

Assim, parece que você poderia ter uma classe definida dentro de um objeto, mas não uma classe estática definida dentro de uma classe.

Não tenho certeza eu entendi completamente o seu caso de uso ... Se ele pode ajudá-lo, objetos classes dentro são visíveis como os campos de uma instância, e.

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)

Além disso, você pode perfeitamente substituir val de um pai com objeto:

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)

Em scala se você precisa criar um alguns métodos estáticos que você pode usar um objeto companheiro, com o mesmo nome da classe, onde você armazena todos os métodos pseudo estáticos. Ex:

class A {
}

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

Em seguida, você pode apenas usar A.xpto.
Tente ler mais sobre módulos companheiro em scala

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top