是否可以在方法中定义参数x,使得x的类型是实现给定函数签名的通用类型T
(让我们说def apply() : Double
),而不引入新型?
[示例]目标是定义类似的东西(我只是为了说明而使用adhoc语法):
def foo(x : T with def apply() : Double) = { ... }
目前,我可以引入一个新类型ApplyDouble
,但这需要我将所有可能的类型扩展为'foo',其实例是合法参数,然后将foo的签名转换为
def foo(x : ApplyDouble) = { ... }
答案 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
的定义将为您提供有关反射访问的警告,您可以通过添加导入或编译器选项来避免这种情况(如警告消息中所述)。
请注意,在结构类型上调用方法时会涉及一些开销,因此如果您需要在紧密的内部循环中进行此操作,则可能需要重新考虑一下您的方法。但在大多数情况下,它可能不会产生明显的差异。