Метод Scala, который принимает несколько различных объектов, каждый из которых расширяет одну и ту же черту - PullRequest
1 голос
/ 17 мая 2019

У меня есть trait Document[T] и два класса case, которые расширяют эту черту:

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], либо Seq[Fax] в качестве аргумента.

Я создаю классы дел для запуска через конвейер Stanford CoreNLP, и я хочу иметь возможность поддерживать добавление нескольких классов дел, расширяющих черту Document[T] в будущем (например, позже добавим поддержку Pamphlet(...) extends Document[Pamphlet]) .

Любая помощь будет принята с благодарностью. Если вам потребуется дополнительная информация, я с удовольствием предоставлю ее.

1 Ответ

1 голос
/ 17 мая 2019
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]= ???
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...