5

是否可以在方法中定义参数 x,使得 x 的类型T是实现给定函数签名(假设为def apply() : Double)的泛型类型,而不引入新类型?

[示例] 目标是定义类似的东西(我使用临时语法只是为了说明):

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

目前,我可以引入一个新类型ApplyDouble,但这需要我将所有可能的类型,其实例是合法参数的所有类型都扩展为“foo”,然后将 foo 的签名转换为

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

4

1 回答 1

8

当然,可以使用结构类型,而且您甚至几乎掌握了正确的语法:

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将为您提供有关反射访问的警告,您可以通过添加导入或编译器选项来避免这种情况(如警告消息中所述)。

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

于 2013-07-29T19:19:12.027 回答