2013-07-29 21 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