首页 > 解决方案 > 如何将特征表达式转换为单个抽象方法

问题描述

假设我定义以下内容:

trait T {
    def foo(): Int
}

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

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

编译器给了我警告:

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

但是当我尝试

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

我得到错误

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

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

标签: scala

解决方案


你只需要这个:

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

推荐阅读