Scala中无法用Lambda重写抽象函数的原因咨询
为什么你的Scala代码编译失败?
嘿,我来帮你拆解下问题所在:
你的代码编译报错的核心原因是你没有正确实现 trait Aaa 中定义的方法 a,两者的方法签名完全不匹配。
先看签名差异:
- 在 trait
Aaa里,def a(i: Int): Boolean定义的是一个接受Int类型参数、返回Boolean的方法。 - 而你在
Bbb中写的def a = (x: Int) => x == 42,实际是定义了一个无参数方法,返回一个Int => Boolean类型的函数值——这和父 trait 要求的签名完全不是一回事,编译器自然会认为你没实现抽象方法,要求Bbb变成抽象类。
两种修复方案:
方案1:按trait要求实现方法(最常规的写法)
直接按照Aaa的方法签名来实现,把参数明确写出来:
trait Aaa { def a(i: Int): Boolean } class Bbb extends Aaa { override def a(i: Int): Boolean = i == 42 }
这里的override关键字在Scala 2中可以省略(因为是实现抽象方法),但在Scala 3中推荐加上,代码可读性更好。
方案2:调整trait定义适配函数值(如果你确实想用函数)
如果你本来的意图就是让a是一个函数值,那可以修改trait Aaa的定义,让它的成员是函数类型:
trait Aaa { val a: Int => Boolean } // 或者用def:trait Aaa { def a: Int => Boolean } class Bbb extends Aaa { val a = (x: Int) => x == 42 }
这样两者的类型就匹配了,编译就能顺利通过。
内容的提问来源于stack exchange,提问作者Moebius
相关产品推荐
相关产品推荐

