Scala类型检查抱怨lambda,而不是显式函数
我有以下
Scala代码:
import java.util.{Comparator,function} object ComparatorTest { Comparator.comparing[Int,String](new function.Function[Int,String] { override def apply(t: Int): String = t.toString }) } 编译没有问题.我想我应该能够用lambda替换该函数(that’s what I understand from the doc,at least,并且IntelliJ具有相同的意见).但是,当我用它替换它 Comparator.comparing[Int,String]((t: Int) ? t.toString) 我收到编译器错误: Error:(6,23) overloaded method value comparing with alternatives: (x$1: java.util.function.Function[_ >: Int,_ <: String])java.util.Comparator[Int] <and> (x$1: java.util.function.Function[_ >: Int,_ <: String],x$2: java.util.Comparator[_ >: String])java.util.Comparator[Int] cannot be applied to (Int => String) Comparator.comparing[Int,String]((t: Int) ? t.toString) (在我看来,第一种选择应该匹配.) I’ve just asked a similar question,解决方案是明确指定类型参数,但在这种情况下,我想我已经指定了我能做的一切.是否有另一种使用lambda的解决方案,或者是否需要显式函数?如果是后者,是否有一个文档解释了什么时候lambda可以替代SAM? 解决方法
TL; DR:使用
Ordering 而不是直接使用Comparator.
您可以使用类型归属强制它将您的参数识别为java.util.function.Function [Int,String]: Comparator.comparing[Int,String]((_.toString) : function.Function[Int,String]) 请注意,_.toString周围的括号是必需的;否则,它会尝试将ascription应用于lambda中的表达式而不是lambda作为整体.此代码基本上等同于: val tmp: function.Function[Int,String] = _.toString Comparator.comparing[Int,String](tmp) 但是,在编写Scala时,通常最好使用Ordering.由于Ordering扩展了Comparator,它可以在预期的比较器的任何地方使用.您可以使用它: val cmp: Comparator[Int] = Ordering.by(_.toString) 要么: val cmp = Ordering.by[Int,String](_.toString) 正如您所看到的,类型推断在这里工作得更好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |