2009-07-01 77 views
34

什么是Java这样的Scala中模拟:静态内部类中阶

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真是的OuterOuter的“类型”实际上有一个很长的名字。所以:

class SomeHorriblyLongNameType 
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType) 

这是详细和可怕的。我可以用代替Type,但是它和它所涉及的类之间没有明显的联系。呼

回答

35

你可以做这样的事情,如果没有需要访问外部类中的内部类(这你就不必在Java中考虑到你的内部类被声明static):

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

From scala-lang

没有 '静态' 的成员 Scala中的概念。相反,斯卡拉把Y类的 静态成员 单身对象Ÿ

这么看来,你可以有一个对象中定义的类的成员,但不是一个类中定义一个静态类。

+0

如果您在Scala中声明了一个类中的对象,那么它在该类之外是不可见的(或者我不知道如何制作它)。你的回答并不完全是我所问的:我在问我如何在Scala中做些什么,而不是问Scala如何处理Java静态代码 – 2009-07-01 17:14:08

+0

我已经在orig qn上展开 – 2009-07-01 17:20:56

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-classes的实例。一个类是好的,点击,另一个是取消。点击。如果你想参考所有Click类的类型,你可以说Button#Click。

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) 
0

在Scala中,如果你需要创建一些静态方法,你可以使用一个同伴对象,用的名称相同类,您可以在其中存储所有伪静态方法。例如:

class A { 
} 

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

然后您可以使用A.xpto
尝试阅读关于scala上的伴侣模块的更多信息