Scala中使用Java进行此类操作的模拟是什么:
public class Outer {
private Inner inner;
public static class Inner {
}
public Inner getInner() { return inner; }
}
我特别希望我的内部课程不必须有一个完全限定的名字 - 即我想要Trade.Type
,而不是TradeType
。所以在Scala我想象它可能是这样的:
class Outer(val inner: Inner) {
object Inner
}
但这似乎不起作用:我的scala Inner
似乎从Outer
类外部看不到。一种解决方案当然是:
class Inner
class Outer(val inner: Inner)
哪个好 - 但由于我的班级名称,Inner
实际上是Outer
的“类型”,Outer
实际上有一个长名称。所以:
class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)
这是冗长而可怕的。我可以用SomeHorriblyLongNameType
替换Type
但是它与它所关联的类之间没有明显的联系。呼
答案 0 :(得分:36)
如果不需要访问内部类中的外部类(由于您的内部类被声明为static
而不能在Java中使用),您可以执行类似这样的操作:
object A{
class B {
val x = 3
}
}
class A {
// implementation of class here
}
println(new A.B().x)
答案 1 :(得分: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-类的实例。一个类是ok.Click,另一个是cancel.Click。如果你想引用所有Click类的类型,你可以说Button#Click。
答案 2 :(得分:6)
答案 3 :(得分: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)
此外,您可以使用object:
完美地覆盖父级的valcase 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)
答案 4 :(得分:1)
在scala中,如果需要创建一些静态方法,可以使用具有相同名称的伴随对象,在该对象中存储所有伪静态方法。例如:
class A {
}
object A {
def xpto // define some pseudo static methods here..
}
然后你可以使用A.xpto
尝试阅读有关scala上的随播模块的更多信息