如何将特征表达式转换为单个抽象方法

时间:2019-05-11 13:03:26

标签: scala

说我定义以下内容:

trait T {
    def foo(): Int
}

def bar(t: T): Int = {
    t.foo()
}

bar(new T {
    def foo() = 3
})

编译器给我警告:

  

将表达式转换为单一抽象方法

但是当我尝试

bar(new T(() => 3))

我得到了错误

  

T是一个特征,因此没有构造函数

特征可以转换为单个抽象方法吗?

1 个答案:

答案 0 :(得分:3)

您只需要这个:

bar(() => 3)
Scala中的

SAM与Java中的FunctionalInterface类似。因此,如果您的trait / abstract类仅定义了一种抽象方法,则将其视为SAM(单一抽象方法)类型,并且可以将其编写为简单的lambda。

它也适用于变量分配:

val a = () => 3 // compiler would infer () => Int for a
val b: T = () => 3 // type of b is T