假设我定义了以下内容:

trait T {
    def foo(): Int
}

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

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

编译器给了我警告:



但是当我尝试
bar(new T(() => 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

关于scala - 如何将特征表达式转换为单个抽象方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56090600/

10-10 22:43