使用类型参数时Scala中的重载

时间:2011-09-06 11:32:40

标签: scala types overloading

看看我正在处理的这段代码(它的意思是从main方法的参数中解析一些参数):

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 个答案:

答案 0 :(得分:3)

重载不是编译器所关心的。

<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"