当我遇到以下错误时,我无法理解如何使用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
答案 0 :(得分:0)
问题是内部类必须属于外部类的相同实例。但actionList(i)
是否保证两次调用之间的实例相同?编译器肯定不知道(可能是另一个线程弄乱它?谁知道apply
做了什么?),所以它抱怨。 _13
是一个临时变量的名称,它希望确保它 是同一个实例。
您的下一个工作正常,因为编译器可以看到您调用actionList(i)
一次,存储该实例,从中获取内部类,然后应用它。
所以,故事的道德是:你需要让编译器充分明白你的内部类实例与其正确的外部类匹配,并且最好的方法是将该外部类存储在val中没有你(或编译器)注意到它无法改变的地方。
(如果你拆分参数块,你也可以指定单个变量的类型。例如:def foo(m: EntityModel)(l: m.EntityLabel)
将是一种编写一个函数的方法,该函数将外部类作为与其对应的内部类。 )