2011-09-06 37 views
-1

看看这段代码,我是做什么工作的(它的意思从主方法的参数解析一些参数):也在斯卡拉重载时类型参数正在使用

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) 

是否有一个原因,当类型参数都在使用我不能超载?

回答

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

非常感谢您的帮助。你有什么想法,我怎么能指定我在定义方法时使用的“解析器”? –

+0

不是。考虑一个稍微其他的设计,你将会有一个类型为'String => String'的'transformer'而不是'String => T'类型的'modifier'。知道,你需要一个函数'String => String',你可以提供's => s''等身份函数的默认值),而不是重载整个方法。您可以在下一步中修改结果。 – agilesteel