Scala: типизированный метод, который возвращает объект указанного типа. - PullRequest
0 голосов
/ 02 октября 2018

Всем доброго времени суток,

Мне нужно создать Typed Class с функцией Typed для анализа Array [String] и возврата Array [OutputType]

class Data()
class IntData(var element: Int) extends Data
class BoolData(var element: Boolean) extends Data

class ArrayParser[OutputType <: Data]() {
    def parse(in: Array[String]): Array[OutputType] = {
        in.map(s => parseRecord(s))
    }
}

Я пытался:

    def parse(in: Array[String]): Array[OutputType] = {
        in.map(s => {
            import scala.reflect.runtime.universe._
            if (typeOf[OutputType] =:= typeOf[IntData])
                new IntData(s.toInt)
            else
                new BoolData(s.toBoolean)
        })
    }

но я получил ошибку: Выражение типа Array [Data] не соответствует ожидаемому типу Array [OutputType]

Что я могу сделать длявыполнить требования?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 02 октября 2018

Почему бы не определить класс Typec для синтаксического анализа строки в соответствующий тип?

trait Parser[T <: Data] { 
  def parse(s: String): T
}

implicit val intParser: Parser[IntData] = ???
implicit val boolParser: Parser[BoolData] = ???

def parse[T <: Data : Parser](a: Array[String]): Array[T] = { 
  val p = implicitly[Parser[T]]
  a.map(s => p.parse(s))
}

Также я бы посоветовал сделать Data запечатанной чертой, а ее классы реализаций реализованы.

...