什么是Java中这样做的斯卡拉模拟:
public class Outer {
private Inner inner;
public static class Inner {
}
public Inner getInner() { return inner; }
}
我特别希望我的内部类不是必须有一个完全合格的名称-即我想Trade.Type
,不TradeType
。 因此,在斯卡拉我想象它可能是这样的:
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
但随后会有它和它相关的类之间没有明显的联系。 表示不快
你可以做这样的事情,如果没有需要访问外部类中的内部类(这你就不必在Java中考虑到你的内部类被声明static
):
object A{
class B {
val x = 3
}
}
class A {
// implementation of class here
}
println(new A.B().x)
正如其他人所指出的那样,“静态”类应放在同伴对象内。
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-类的实例。 一类是ok.Click,另一个是cancel.Click。 如果你想指的是所有点击类的类型,你可以说按钮#点击。
从斯卡拉琅 :
没有Scala的“静态”的成员概念。 相反,斯卡拉把Y类的静态成员作为单一对象的Y的成员
这么看来,你可以有一个对象中定义的类,而不是一个类的内部定义的静态类。
不知道我完全理解你的使用情况......如果它可以帮助你,里面的对象类是像一个实例的领域,例如可见
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)
在Scala中,如果你需要创建你可以使用一个同伴对象,带班,在那里你存储所有的伪静态方法的名称相同的一些静态方法。 例如:
class A {
}
object A {
def xpto // define some pseudo static methods here..
}
然后,你可以只使用A.xpto
。
尝试阅读更多关于Scala的伴侣模块