Domanda

Qual è l'analogo a Scala di fare questo in Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

Voglio specificamente la mia classe interna a non deve avere un nome completo - cioè voglio Trade.Type, non TradeType. Quindi, in Scala ho immaginato che potrebbe essere qualcosa di simile:

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

Ma questo non sembra funzionare: la mia scala Inner proprio non sembra essere visibile dall'esterno del Outer di classe. Una soluzione sarebbe ovviamente:

class Inner
class Outer(val inner: Inner)

che è ok - ma a causa dei nomi dei miei corsi, SomeHorriblyLongNameType è davvero il "tipo" del Type e <=> in realtà ha un nome lungo. Quindi:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

Il che è prolisso e orribile. Mi potrebbe sostituire <=> con appena <=> ma ci sarebbe quindi alcun legame evidente tra esso e la classe si era legato a. Uff

È stato utile?

Soluzione

Si può fare qualcosa di simile, se non è necessario l'accesso alla classe esterna nella classe interna (che non avrebbe in Java dato che la classe interna è stata dichiarata static):

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

Altri suggerimenti

Come altri hanno fatto notare, le classi "statica" dovrebbero essere posizionati all'interno dell'oggetto compagna.

In Scala, classi, i tratti, e gli oggetti che sono membri di una classe sono dipendente dal percorso. Ad esempio:

class Button {
  class Click
}


val ok = new Button
val cancel = new Button

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

Ora C1 e C2 sono istanze di classi -different-. Una classe è ok.Click, e l'altro è cancel.Click. Se si voleva fare riferimento al tipo di tutte le classi Click, si potrebbe dire che Button # Fare clic su.

da Scala-lang :

  

non v'è alcuna nozione di membri 'statici'   a Scala. Invece, Scala tratta   membri statici della classe Y come membri   dell'oggetto singleton Y

Così sembra si potrebbe avere una classe definita all'interno di un oggetto, ma non una classe statica definita all'interno di una classe.

Non sono sicuro ho capito pienamente il vostro caso d'uso ... Se può aiutare, gli oggetti all'interno delle classi sono visibili come i campi di un'istanza, per es.

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)

Inoltre, è possibile ignorare perfettamente val di un genitore con oggetto:

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)

In Scala Se avete bisogno di creare un alcuni metodi statici è possibile utilizzare un oggetto associato, con lo stesso nome della classe, in cui memorizzare tutti i metodi statici pseudo. Es:

class A {
}

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

Poi si può semplicemente utilizzare A.xpto.
Provate a leggere di più su moduli compagno di scala

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top