Scala的trait中重载apply方法报对象无参数错误如何解决?
问题根因
你代码中的报错是因为调用方式错误:
- 你写的
MyFactory(paramInt)语法,在Scala中会优先查找MyFactory伴生对象上定义的apply方法,而你定义的伴生对象object MyFactory为空,没有接收Int参数的apply方法,因此编译器抛出参数不匹配的错误。 - trait内定义的
apply是实例方法,属于继承该trait的实例本身,不属于伴生对象,自然不会被MyFactory(xxx)的写法匹配到。
你举的官方文档中trait默认方法的示例可以正常运行,是因为那些方法调用的都是当前实例的成员,没有引用伴生对象。
修复方案
要在默认实现中调用同一个trait下的另一个重载apply方法,直接使用this指代当前实例即可,同时Scala中方法最后一行会自动作为返回值,不需要显式写return:
trait MyFactory[Record] { def apply(paramInt: Int): MyBuilder[Record] def apply(paramInt: Int, paramString: String): MyBuilder[Record] = { // 对字符串做对应处理 this(paramInt) } } object MyFactory {} class MyBuilder[Record] {}
如果需要明确调用的是当前trait的apply实现,而非子类重写的版本,可以写为super[MyFactory](paramInt)。
内容的提问来源于stack exchange,提问作者user16367669
相关产品推荐
相关产品推荐

