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

Scala 如何将特征表达式转换为单个抽象方法,scala,Scala,假设我定义如下: trait T { def foo(): Int } def bar(t: T): Int = { t.foo() } bar(new T { def foo() = 3 }) 编译器向我发出警告: 将表达式转换为单个抽象方法 但是当我尝试的时候 bar(new T(() => 3)) 我得到了错误 T是一个特征,因此没有构造函数 特征可以转换为单个抽象方法吗?您只需要: bar(() => 3) Scala中的SAM与Java中的

假设我定义如下:

trait T {
    def foo(): Int
}

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

bar(new T {
    def foo() = 3
})
编译器向我发出警告:

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

但是当我尝试的时候

bar(new T(() => 3))
我得到了错误

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

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

您只需要:

bar(() => 3)
Scala中的SAM与Java中的类似。因此,如果您的trait/abstract类只有一个要定义的抽象方法,那么它将被视为SAM(singleabstractmethod)类型,并且可以像编写简单的lambda一样编写

它也适用于可变分配:

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