2011-11-27 79 views
0

查找发现Scala的内部类:不能在这个例子

class Outer(private val handler: Actor){ 
    def this() = this(new Handler) // type Handler not found ? ? 

class Handler extends Actor{ 
    override def act() { 

    } 
    } 
} 

编译器抱怨类Handler没有找到。这是一个错误?

回答

4

内部类Handler对外部类实例有引用,并且您正试图在外部实例存在之前创建new Handler - 这是不可能的。

你可以尝试这样的事情,而不是:

class Outer(h: Actor = null) { 

    private val handler = 
    if (h != null) h 
    else new Handler 

    class Handler extends Actor { 
    override def act() { 

    } 
    } 
} 

如果你担心使用null,您可以使用the solution described here更换null在参数的缺省值。

+0

什么好的解决办法! –

2

首先,您可能知道访问内部类是通过点(。)运算符。因此访问Handler类应该是Outer.Handler。当你在this范围内时,编译器找不到Handler类,因为内部类与外部对象绑定。在这里,一切都得到了更好的解释:http://www.scala-lang.org/node/115。总之,你会得到一个完全不可能的情况,因为内部类隐藏在外部类中,但外部类的实际实例化需要内部类...

有很多方法可以解决它我猜,我在这里快速画出一张。由于您可能希望Handler类以某种方式绑定到Outer,所以我建议创建并对象,然后从这里调用Outer类。因此,你会得到大致相同的语法,并且所有内容都存储在一个地方。它可能是这个样子:

class Outer(private val handler : Actor) 

object Outer { 
    class Handler extends Actor { override def act { } } // The "inner" class 
    def apply() = new Outer(new Handler) 
    def apply(handler : Actor) = new Outer(handler) 
} 

希望帮助:)

+0

如果在对象“Outer”中定义了“Handler”,则只能写入'Outer.Handler',因此不会引用实际外部对象的实例。你正在改变OP的语义。 –

+0

呃我不确定你的意思。我的观点是,我认为改变结构来创建外部对象而不是推断外部对象更容易。对我来说,它更加干净。特别是如果我能避免可变结构。 –

+0

您的'Handler'类没有引用外部对象,因此,即使它看起来比较干净,您也正在改变OP所希望的语义。我的解决方案不(也不使用可变结构)。 –

相关问题