2011-10-14 66 views
4

我想要一個方法,可以使用或不使用類型參數來調用,併爲每個方法返回不同的值。下面是一些明顯的簡化代碼:重載基於類型參數的方法

object Foo { 
    def apply() = "Hello" 
    def apply[T]() = 1 
} 

與一類參數調用它是好的:

scala> Foo[String]() 
res1: Int = 1 

但稱它沒有一個類型參數不起作用:

scala> Foo() 
<console>:9: error: ambiguous reference to overloaded definition, 
both method apply in object Foo of type [T]()Int 
and method apply in object Foo of type()java.lang.String 
match argument types() 
     Foo() 

這不是運行時問題,所以添加一個隱含的虛擬參數並沒有幫助。也沒有限制參數(Foo[Unit]())。有什麼辦法可以做到這一點,對編譯器來說不是不明確的嗎?

回答

2

您正在有效地重載返回類型。 雖然Scala和Java都沒有讓你在這種情況下通常會讓你這樣做。

Foo() : String將在這種情況下工作,但它仍然值得懷疑,儘管如果重載類型的重載是可取的。

+0

你說得對,'Foo():String'起作用。然而,這並不是很理想 - 整個想法僅僅是調用代碼。我真正想說的是「我調用了這個參數的版本,它接受零類型參數,而不是隻接受一個類型參數的版本」。 –

+0

像這樣:'Foo []()' –