You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:42:02