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

Scala3中如何编写接收自定义类作为参数的@main方法

解决Scala @main方法接收自定义类参数的编译错误

错误原因

Scala的@main方法会自动解析命令行传入的字符串参数,但默认仅支持基本数据类型(如Int、String)。自定义类B没有内置的字符串转实例规则,编译器找不到scala.util.CommandLineParser.FromString[B]的隐式实例,因此报错。

解决方案

需要为自定义类B提供FromString隐式实例,明确字符串到B对象的转换逻辑。同时注意:类的构造参数若需外部访问,要声明为val(否则无法在main方法中读取参数值)。

修改后的代码示例

// 将构造参数x声明为val,允许外部访问
class B(val x: Int) {}

object B {
  // 提供隐式解析器:把命令行字符串转为B实例
  implicit val fromString: scala.util.CommandLineParser.FromString[B] =
    (s: String) => new B(s.toInt)
}

@main def foo(b: B): Unit = {
  println(s"成功接收B实例,x的值为: ${b.x}")
}

运行方式

命令行执行程序时,传入整数字符串即可:

foo 123

程序输出:成功接收B实例,x的值为: 123

简化写法(直接在作用域定义隐式)

如果不需要伴生对象,也可以直接在main方法所在作用域定义隐式实例:

class B(val x: Int) {}

// 直接在作用域中声明隐式解析器
implicit val bFromString: scala.util.CommandLineParser.FromString[B] =
  (s: String) => new B(s.toInt)

@main def foo(b: B): Unit = {
  println(s"成功接收B实例,x的值为: ${b.x}")
}

关键要点

  • @main的参数类型必须对应FromString隐式实例,才能完成命令行字符串到目标类型的转换
  • 自定义类的构造参数若需外部访问,需声明为val或var
  • 隐式实例放在类的伴生对象中时,会被自动导入作用域,无需手动引用

内容的提问来源于stack exchange,提问作者ShittyHobbyDev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:09:59