2015-11-03 58 views
1

上通用选择所需的功能,知道这是可以做到,但我不记得(或定位)对我的生活的语法。我如何指定函数定义中的泛型类型必须存在特定函数?我如何指定斯卡拉

举例来说,我知道我能做到这一点:

def blah[A](p: A) 

我真正想要的是这样的(但我的语法都错了,当然):

def blah[A(someFunction)](p: A) 

回答

2

我不知道,如果使用,这是一个好主意,但在这里是如何工作的:

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

2

什么你”重新寻找被称为“结构类型”。

从这里的任何实例: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,要求任何参数实现该特性慢。