Scala和类型绑定给定的操作

时间:2013-07-29 19:01:20

标签: scala

是否可以在方法中定义参数x,使得x的类型是实现给定函数签名的通用类型T(让我们说def apply() : Double),而不引入新型?

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

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

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

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

1 个答案:

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

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