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 中的FunctionalInterface。因此,如果您的 trait/abstract 类只有一个要定义的抽象方法,则它被视为 SAM(单一抽象方法)类型,并且可以像简单的 lambda 一样编写。
它也适用于变量赋值:
val a = () => 3 // compiler would infer () => Int for a
val b: T = () => 3 // type of b is T
推荐阅读
- list - 从 firestore 中的文档查询集合创建列表
- vba - 如何仅提取最新或今天的附件
- redirect - codeigniter 4 url 链接到外部网页,如何使用控制器完成?
- c++ - 检测对 __fp16 的支持
- php - Laravel 从总和之前的行中削减数量
- python - 当图像中并非所有值都存在时,强制“imshow”根据“Colormap”颜色正确着色像素?
- python - 单变量函数上的 Basin-Hoping 方法的界限
- reactjs - `useMemo` 没有按预期工作,它引入了一个无限的 lopp
- node.js - Node JS 应用程序没有从邮递员那里获取值
- regex - 使用 Perl 脚本将数字替换为 XML 文件中的字符串