静态内部类 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 的内部类的主要内容,如果未能解决你的问题,请参考以下文章