【问题标题】:Cannot apply [-] to AnyVal in scala无法将 [-] 应用于 scala 中的 AnyVal
【发布时间】:2021-02-15 07:33:55
【问题描述】:

我正在编写一些代码来比较两个双精度值并将一个从字符串解析为双精度值。如下所示:

val diffFun0  = (dims:Dims) => (dims.score ==  zippedSubs(dims.dimension_name).trim.toDoubleOption.getOrElse(0))

val diffFun  = (dims:Dims) => (dims.score -  zippedSubs(dims.dimension_name).trim.toDoubleOption.getOrElse(0)).abs > 0.01

//zippedSubs(dims.dimension_name) is double inside string "0.1" or something else


diffLen0 += ods.dimensions.count(diffFun0) //play.sbt.PlayExceptions$CompilationException: Compilation error[Overloaded method value [-] cannot be applied to  (AnyVal)] 

diffLen += ods.dimensions.count(diffFun) //works totally fine

IDE 显示 zippedSubs(dims.dimension_name).trim.toDoubleOption.getOrElse(0) 是 double 类型,当我们使用 == 运算符时一切正常。但其他情况则不然。

【问题讨论】:

    标签: scala playframework jvm implicit


    【解决方案1】:

    您将类型 Double 与 Int 混合使用什么给了您 AnyVal。将getOrElse(0) 替换为getOrElse(0.0),一切正常。

    "0".toDoubleOption.getOrElse(0)
    // val res0: AnyVal = 0.0
    
    "0".toDoubleOption.getOrElse(0.0)
    // val res0: Double = 0.0
    

    【讨论】:

    • 感谢它的工作,但为什么事情在 == 运算符案例中工作
    • == 不要求两个操作数的类型相同,它是为所有类型定义的。相比之下,- 方法不存在 AnyVal
    • 切线,由于弱一致性,"0".toDoubleOption.getOrElse(0) 将在预期类型为 double 时起作用,但如果类型留待推断则不会:scastie.scala-lang.org/2PTuNloZRxqjT1dw78XsAQ
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多