Как мне создать универсальную функцию Scala, которая возвращает объект на основе универсального типа? - PullRequest
7 голосов
/ 08 декабря 2011

(вопрос для начинающих в Scala)

Я пытаюсь написать программу в Scala, которая выполняет ряд проверок исходных файлов C ++, и я хочу реализовать необязательную регистрацию проверок.

Следующее прекрасно работает для одной проверки:

  val headerFiles = files.filter(_.matches(".*?\\.h$"))
  val headerGuardChecker = if(options.contains('verbose)) {
    new HeaderGuard with LoggingFileCheckerTrait
  } else {
    new HeaderGuard
  } 
  headerFiles.foreach(h => if (! headerGuardChecker.check(new File(h))) println(h + " doesn't have a header guard"))

, однако, когда я пытаюсь обобщить это с помощью обобщений:

  def checker[T] = if(options.contains('verbose)) {
    new T with LoggingFileCheckerTrait
  } else {
    new T
  } 
  val headerFiles = files.filter(_.matches(".*?\\.h$"))
  headerFiles.foreach(h => if (! checker[HeaderGuard].check(new File(h))) println(h + " doesn't have a header guard"))

Я получаю ошибки компиляции на двух new заявления, утверждающие, что T не тип.Я верю, что это вызвано стиранием типов, но я не нашел способ обойти это.Есть ли способ сделать то, что я хочу сделать?

1 Ответ

7 голосов
/ 08 декабря 2011

Взгляните на Scala "манифесты".Они часто позволяют обойти стирание типа на JVM.

scala> def instantiate[T](implicit m:Manifest[T]) = m.erasure.newInstance().asInstanceOf[T]
instantiate: [T](implicit m: Manifest[T])T

scala> instantiate[String]
res0: String = ""

Вот хорошее введение для манифестов в Scala

...