为什么Scala中的内部类绑定到外部类对象

时间:2017-02-17 15:06:21

标签: scala

我无法理解为什么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 **
}

1 个答案:

答案 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具有路径依赖类型的概念。但这是完全不同的答案。