处理Scala中的嵌套类

时间:2015-04-01 21:45:32

标签: scala class nested

当我遇到以下错误时,我无法理解如何使用Scala esp中的嵌套类:

class Action {
  val entityModelVar = new EntityModel
}

class EntityModel {
  class EntityLabel {
   ....
   }
}

上面的代码片段给出了关于我的类结构的想法。这里有两个代码块让我对它们的工作方式感到困惑。

val actionList=Array[Action](Action1,Action2)
..
val newLabels=actionList(i).test(doc)
actionList(i).retrain(newLabels) //error pointed here

**Error: type mismatch:
found   : Seq[a.entityModelVar.EntityLabel]
required   : Seq[_13.entityModelVar.EntityLabel] where _13:Action**

但是,以下代码编译时没有任何错误:

//This works fine
val a=actionList(i)
val newLabels=a.test(doc2)
a.retrain(newLabels)

此外,这里是retrain函数的定义:

 def retrain(labels:Seq[entityModelVar.EntityLabel])={
   entityModelVar.retrain(labels)
 }

EntityModel.retrain函数的签名:

def retrain(testLabels:Seq[EntityLabel]):Unit

1 个答案:

答案 0 :(得分:0)

问题是内部类必须属于外部类的相同实例。但actionList(i)是否保证两次调用之间的实例相同?编译器肯定不知道(可能是另一个线程弄乱它?谁知道apply做了什么?),所以它抱怨。 _13是一个临时变量的名称,它希望确保它 是同一个实例。

您的下一个工作正常,因为编译器可以看到您调用actionList(i)一次,存储该实例,从中获取内部类,然后应用它。

所以,故事的道德是:你需要让编译器充分明白你的内部类实例与其正确的外部类匹配,并且最好的方法是将该外部类存储在val中没有你(或编译器)注意到它无法改变的地方。

(如果你拆分参数块,你也可以指定单个变量的类型。例如:def foo(m: EntityModel)(l: m.EntityLabel)将是一种编写一个函数的方法,该函数将外部类作为与其对应的内部类。 )