【问题标题】:Scala and type bound with a given operationScala 和类型与给定操作绑定
【发布时间】:2013-07-30 03:28:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。这正是我一直在寻找的 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2015-06-05
    • 1970-01-01
    • 2021-04-18
    • 2013-06-20
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多