2013-07-29 22 views
5

是否有可能在方法中定义参数x,使得x的类型是实现给定函数签名(让我们说def apply() : Double)的通用类型T,而不会引入新型?斯卡拉和与给定的操作绑定的类型

[例]我们的目标是定义类似的信息(我使用即席语法只是为了说明起见):

def foo(x : T with def apply() : Double) = { ... }

目前,我介绍了一种新型ApplyDouble,但需要我延长所有可能的类型,它们的情况下是合法的参数为“富”,然后Foo的签名会变成

def foo(x : ApplyDouble) = { ... }

回答

8

小号URE,有可能与结构类型,你甚至差点语法正确:

def foo(x: { def apply(): Double }) = x.apply 

然后:

scala> foo(() => 13.0) 
res0: Double = 13.0 

或者:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

foo定义会给你反射访问的警告,你可以通过添加一个导入或编译器选项来避免(如警告消息中所述)。

请注意,在调用结构类型的方法时会涉及一些开销,所以如果您需要在紧密的内部循环中使用此方法,您可能需要重新考虑一下您的方法。但在大多数情况下,它可能不会有明显的差异。

+0

谢谢。这正是我所期待的;) – leco