2016-05-02 48 views
1

我是scala的新手,想知道下面的語法是什麼意思?語法函數[T]在scala中意味着什麼

def exec[T](f:() => T): T = { 
    f() 
} 

至於我的理解函數「EXEC」期望功能的「T」型參數和返回值,但後來什麼呢EXEC [T]表示?

+0

的'[T]''中EXEC [T]''T'定義爲一個類型參數。 – marstran

回答

6

exec是方法名稱,其中T是該方法的通用類型參數。

方法簽名需要指定類型T,以便我們能夠指定T作爲該方法的參數。

當使用泛型類型參數,則可以通過不同類型的並重新使用它們之間相同的代碼,例如:

scala> exec[Int](() => 1) 
res29: Int = 1 

scala> exec[Double](() => 1.0) 
res30: Double = 1.0 

scala> exec[String](() => "hello, world") 
res31: String = hello, world 

當我聲明exec[Int],參數f現在是一個Function0[Int]](或() => Int如果我們使用語法糖)

正如@TzachZohar指出的那樣,Scala編譯器足夠聰明,能夠在有時推斷出我們的類型參數,這意味着我們可以在使用該方法時省略方括號。例如:

scala> exec(() => 1) 
res32: Int = 1 

scala> exec(() => 1.0) 
res33: Double = 1.0 

scala> exec(() => "hello, world") 
res34: String = hello, world 

這工作,因爲編譯器能夠通過這些方法來推斷的T類型的返回類型。

你可以閱讀更多關於這些問題:Type & polymorphism basicsGeneric ClassesLocal Type InferenceScala Specification for Local Type Inference

+0

重要的是要注意類型可以被推斷,所以可以調用具有類型參數的方法而不明確指出類型,例如, exec(()=> 1)''就像'exec [Int](()=> 1)' –

+0

@TzachZohar真。我會更新我的答案(更新)。 –

+0

'()=> Int'不是'Function1 [Unit,Int]',它是'Function0 [Int]'。 'Function1 [Unit,Int]'將會是'Unit => Int'並且被調用爲'f(())':) –

相關問題