静态内部类 vs Companion 的内部类

Posted

技术标签:

【中文标题】静态内部类 vs Companion 的内部类【英文标题】:Static inner class vs Companion's inner class 【发布时间】:2014-11-18 10:37:41 【问题描述】:

阅读 Ordesky 关于 Scala 的书的第 20 章,我发现内部类是路径依赖的。在其他特性中,这意味着它们只能在外部类中实例化或提供外部类实例。

问题出现了:我想在 Scala 中实现一个static inner class,但作者认为这是不可能的。 我立即想到让“内部类”(我们称之为Inner)成为Outer 的伴生对象的成员。

this 问题的公认答案似乎指向了这个方向。 但这会导致一个问题:Inner 的类型不是Outer#Inner,我可以尝试类似:

object Outer 
    class Inner extends Outer#Inner   

但这不起作用。你知道这方面的工作吗? 我有预感它可以用抽象类型来完成,但我不确定。

请注意,将 Inner 设为伴随对象的内部类并不完全等同于具有非路径依赖的 Inner 类,因为它的类型。

【问题讨论】:

我想你不只是担心名字好看吗?你错过了什么机械后果/行为,并想和你一起模仿Outer#Inner尝试? @AndrzejDoyle 不,我不只是担心名字,这可以通过我链接的答案来解决。我想获得一个不依赖路径的内部类,或者至少知道这是否可能。 【参考方案1】:

我立即想到让“内部类”(我们称之为 Inner)成为 Outer 的伴生对象的成员。

是的,这是最接近的 Scala 等价物。

但这会导致一个问题:Inner 的类型不是 Outer#Inner

这不是问题,因为Outer#Inner 相当于Java 中Outer非静态 内部类。 IE。它引用了 Outer 对象。

我想获得一个不依赖路径的内部类,或者至少知道这是否可能

如果你想创建一个不能依赖路径使用的非伴随内部类,这是不可能的。当然,您可以随时在代码中写 Outer#Inner 而不是 o.Inner

【讨论】:

以上是关于静态内部类 vs Companion 的内部类的主要内容,如果未能解决你的问题,请参考以下文章

静态类和内部类的区别是啥

内部类和静态内部类有什么区别?

java内部类的静态嵌套类

在静态方法中new 一个内部类对象和new 一个外部类对象的区别

非静态内部类与静态内部类

Java学习笔记3.8.3 内部类 - 静态内部类