特征中具有泛型类型的Single Abstract Method的语法是什么

时间:2018-10-18 14:09:01

标签: scala

说我定义一个具有如下顺序的类:

case class C(i: Int)

implicit def ordering[A <: C]: Ordering[A] = new Ordering[A] {
    def compare(c1: A, c2: A): Int = c1.i.compareTo(c2.i)
}

我从编译器获得以下信息:

  

较少将表达式转换为单一抽象方法(Ctrl + F1)   检查信息:检查表达式是否可以转换为SAM   (单一抽象方法)。   之前:new Thread(new Runnable {       覆盖def run()= println()}
  之后:new Thread(()=> println())

但是对我来说,在这种情况下正确的语法是什么并不明显?我已经尝试过下面的代码,但无法编译:

implicit def ordering[A <: C]: Ordering[A] = new Ordering[A]((c1: A, c2: A) => c1.i.compareTo(c2.i))

1 个答案:

答案 0 :(得分:3)

正确的语法是:

 implicit def ordering[A <: C]: Ordering[A] = (c1: A, c2: A) => c1.i.compareTo(c2.i)

当使用一个且只有一个方法创建特征的实例时,将使用单个抽象方法。

SAM来自java8,在scala 2.12中引入: