如何在Scala中指定通用选择器上的必需函数

时间:2015-11-03 20:22:20

标签: scala generics

我知道这可以做到,但我不记得(或找到)我生活的语法。如何指定函数定义中泛型类型必须存在特定函数?

例如,我知道我可以这样做:

def blah[A](p: A)

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

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

2 个答案:

答案 0 :(得分: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要慢。

答案 1 :(得分: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

启用