我是scala的新手,想知道下面的語法是什麼意思?語法函數[T]在scala中意味着什麼
def exec[T](f:() => T): T = {
f()
}
至於我的理解函數「EXEC」期望功能的「T」型參數和返回值,但後來什麼呢EXEC [T]表示?
我是scala的新手,想知道下面的語法是什麼意思?語法函數[T]在scala中意味着什麼
def exec[T](f:() => T): T = {
f()
}
至於我的理解函數「EXEC」期望功能的「T」型參數和返回值,但後來什麼呢EXEC [T]表示?
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 basics,Generic Classes,Local Type Inference和Scala Specification for Local Type Inference
重要的是要注意類型可以被推斷,所以可以調用具有類型參數的方法而不明確指出類型,例如, exec(()=> 1)''就像'exec [Int](()=> 1)' –
@TzachZohar真。我會更新我的答案(更新)。 –
'()=> Int'不是'Function1 [Unit,Int]',它是'Function0 [Int]'。 'Function1 [Unit,Int]'將會是'Unit => Int'並且被調用爲'f(())':) –
的'[T]''中EXEC [T]''T'定義爲一個類型參數。 – marstran