2011-09-06 39 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