静态内部类 vs 伴生对象的内部类

3
阅读 Ordesky 的 Scala 书籍第 20 章,我发现内部类是路径相关的。除了其他特性之外,这意味着它们只能在外部类内部实例化或者给出外部类实例。
问题是:我想在 Scala 中实现一个静态内部类,但作者认为这不可能。 我立即想到将“内部类”(我们称之为 Inner)作为 Outer 的伴生对象的成员。 this 问题的被接受答案似乎指向了这个方向。 但是会遇到一个问题:Inner 的类型不是 Outer#Inner,我可以尝试一些类似于:
object Outer {
    class Inner extends Outer#Inner { } 
}

这不起作用。你知道有什么解决方法吗? 我有一种预感,它可以使用抽象类型来完成,但我不确定。
请注意,将“Inner”作为伴生对象的内部类并不完全等同于具有非路径依赖的“Inner”类,因为其类型不同。

我假设你不仅仅是关注名称的美观?你想模仿的是哪种机械后果/行为,同时又希望通过“Outer#Inner”尝试来实现呢? - Andrzej Doyle
@AndrzejDoyle 不,我不仅担心名称,这可以通过我链接的答案解决。 我想获得一个不是路径相关的内部类,或者至少知道是否可能。 - Pablo Francisco Pérez Hidalgo
1个回答

1
我立即想到将“内部类”(我们称之为Inner)作为Outer的伴生对象的成员。是的,这是最接近Scala的等价物。
但这会带来一个问题:Inner的类型不是Outer#Inner。
这不是问题,因为Outer#Inner相当于Java中的非静态内部类。也就是说,它引用了一个Outer对象。
如果您想创建一个非路径相关的非伴生内部类,那么是不可能的,或者至少要知道是否可能。当然,在代码中您可以始终使用Outer#Inner而不是o.Inner。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接