可以接受多个不同对象的Scala方法,所有对象都扩展了相同的特征

时间:2019-05-17 19:15:42

标签: scala class traits

我有一个trait Document[T]和两个扩展该特征的案例类:

Memo(...) extends Document[Memo]
Fax(...) extends Document[Fax]

每个代表一种不同类型的文本文件。

我想使用一些文本工具来清理这些文档,但是创建同时使用这两种类型的方法使我感到烦恼。

val rawText: Seq[String]
// The text of all documents where one string in the sequence is the text of one document

val documentType = "Memo"
// Can also be "Fax"

val documentObjects = documentType match {
case "Memo" => rawText.map(_.makeMemoDocument) // results in Seq[Memo]
case "Fax" => rawText.map(_.makeFaxDocument) // results in Seq[Fax]
}

// Here lies my dilemma...
def processDocuments(docs: Seq[Document[T]]): Seq[Document[T]] = {...}

val processedDocs = processDocuments(documentObjects)

我想以某种方式定义documentObjects,以便processDocuments可以方便地接受它,即processDocuments应该接受Seq[Memo]或{{1} }作为参数。

我正在创建要通过Stanford CoreNLP管道运行的案例类,并且我希望将来能够支持添加多个扩展了Seq[Fax]特性的案例类(例如,稍后,添加对{{ 1}})。

任何帮助将不胜感激。如果您需要更多信息,我们很乐意提供。

1 个答案:

答案 0 :(得分:1)

val documentObjects:Document[_] = documentType match {
   case "Memo" => rawText.map(_.makeMemoDocument) // results in Seq[Memo]
   case "Fax" => rawText.map(_.makeFaxDocument) // results in Seq[Fax]
}

def processDocuments[T](docs: Seq[Document[T]]): Seq[Document[T]] = ???
val processedDocs = processDocuments(Seq(documentObjects))

或删除documentObjects上的类型声明并使用

def processDocuments(docs: Seq[Document[_]]): Seq[Document[_]] = ???
//or
def processDocuments[T <: Document[_]](docs: Seq[T]): Seq[T]= ???