上通用選擇所需的功能,知道這是可以做到,但我不記得(或定位)對我的生活的語法。我如何指定函數定義中的泛型類型必須存在特定函數?我如何指定斯卡拉
舉例來說,我知道我能做到這一點:
def blah[A](p: A)
我真正想要的是這樣的(但我的語法都錯了,當然):
def blah[A(someFunction)](p: A)
上通用選擇所需的功能,知道這是可以做到,但我不記得(或定位)對我的生活的語法。我如何指定函數定義中的泛型類型必須存在特定函數?我如何指定斯卡拉
舉例來說,我知道我能做到這一點:
def blah[A](p: A)
我真正想要的是這樣的(但我的語法都錯了,當然):
def blah[A(someFunction)](p: A)
我不知道,如果使用,這是一個好主意,但在這裏是如何工作的:
def blah[A <: { def someFunction: String }](a: A) : Unit =
println(a.someFunction)
scala> class Test { def someFunction: String = "hello" }
defined class Test
scala> blah(new Test)
hello
scala> class Test2
defined class Test2
scala> blah(new Test2)
<console>:16: error: inferred type arguments [Test2] do not conform to method blah's type parameter bounds [A <: AnyRef{def someFunction: String}]
注意,此功能(所謂的結構類型)使用反射,並且必須使用啓用語言導入import scala.language.reflectiveCalls
什麼你」重新尋找被稱爲「結構類型」。
從這裏的任何實例:https://twitter.github.io/scala_school/advanced-types.html
scala> def foo(x: { def get: Int }) = 123 + x.get
foo: (x: AnyRef{def get: Int})Int
scala> foo(new { def get = 10 })
res0: Int = 133
但是請注意,這將是不僅僅是聲明trait
,要求任何參數實現該特性慢。