说我定义以下内容:
trait T {
def foo(): Int
}
def bar(t: T): Int = {
t.foo()
}
bar(new T {
def foo() = 3
})
编译器给我警告:
将表达式转换为单一抽象方法
但是当我尝试
bar(new T(() => 3))
我得到了错误
T是一个特征,因此没有构造函数
特征可以转换为单个抽象方法吗?
答案 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