我无法理解为什么Scala中的Inner Class绑定到外类对象而不是像Java中那样绑定到外类本身?有人可以解释它背后的任何逻辑。为什么Scala开发人员以这种方式定义内部类?
请参阅下面的示例
class Network
{
class Member()
{
val contacts = new ArrayBuffer[Member]
}
}
object checkInner extends App {
/// creating home network
val home = new Network
val father = new home.Member
val mom = new home.Member
val sister = new home.Member
father.contacts += mom
father.contacts += sister
// creating neighbour network
val neighbour = new Network
val uncle = new neighbour.Member
father.contacts += uncle (this will throw error -> type mismatch; found :
checkInner.neighbour.Member required: checkInner.home.Member)
** but it will work in Java **
}
答案 0 :(得分:1)
Java中的非静态内部类与Scala中的内部类具有完全相同的语义。 (考虑到这一点,两种语言的类型系统的差异可能会引入一些使该陈述无效的事情,但这些与我将要解释的内容无关。)
在Java中,内部(非静态)类包含对用于创建它的外部类的实例的引用。实例化内部类的语法非常清楚(假设对于java case HashPerson是ContainingClass中的非静态内部类):
ContainingClass container = new ContainingClass();
HashPerson william = container.new HashPerson("willy");
(摘自https://stackoverflow.com/a/4070777/480674)
注意container
左侧.new
的方式,就像这个.new
是容器的成员一样。在Scala中,同样是new container.HashPerson("willy");
,在两种语言中,HashPerson实例将依赖在外部类的实例上。
关于内部类(在Java情况下是非静态的)两种语言之间的唯一真正区别是Scala具有路径依赖类型的概念。但这是完全不同的答案。