Перегрузка в Scala при использовании параметров типа - PullRequest
0 голосов
/ 06 сентября 2011

Посмотрите на этот фрагмент кода, над которым я сейчас работаю (он предназначен для анализа некоторых аргументов из аргументов основного метода):

def parser[T](identifier: String, default: T, modifier: String => T): T = {
  val l = args.filter(_.startsWith(identifier))
  if(l.isEmpty) default
  else modifier(l(0).drop(identifier.length).trim)
}

Я также намеревался написать перегруженный метод, которыйимеет дело со случаем строк:

def parser(identifier: String, default: String): String = parser[String](identifier, default, identity)

Компилятор, кажется, не впечатлен этим и не позволит мне перегрузить метод.Мне нужно изменить имя любого из методов, чтобы заставить эту работу:

def parser(identifier: String, default: String): String = genParser[String](identifier, default, identity)

Есть ли причина, по которой я не могу перегрузить, когда используются параметры типа?

1 Ответ

3 голосов
/ 06 сентября 2011

Перегрузка - это не то, что беспокоит компилятор.

<console>:8: error: method parser: (identifier: String, default: String) String does not take type parameters.

Этот код:

parser[String](identifier, default, identity)

вызывает этот метод:

def parser(identifier: String, default: String): String

вместо этогоодин, как вы хотели бы:

def parser[T](identifier: String, default: T, modifier: String => T): T

Эта иллюстрация прекрасно компилируется:

val args = Array[String]()

def parser[T](identifier: String, default: T, modifier: String => T): T = {
  val l = args.filter(_.startsWith(identifier))
  if(l.isEmpty) default
  else modifier(l(0).drop(identifier.length).trim)
}

def parser(identifier: String, default: String): String = "dummy"
...