如何为自定义MyList实现重写toString以实现默认println输出?
让自定义MyList的toString成为println默认输出
要实现println(MyList(1,2,3))直接输出[1, 2, 3],核心是让MyList的实例拥有自定义的toString方法——因为println默认会调用对象的toString方法,你之前错误地把toString写在了伴生对象里,所以没生效。
下面是修改后的完整代码:
sealed trait MyList[+A] { // 重写Any的toString方法,由子类实现具体逻辑 override def toString: String // 私有辅助方法,递归拼接列表元素的字符串 private def toStringHelper: String = this match { case Nil => "" case Cons(x, Nil) => x.toString case Cons(x, xs) => s"$x, ${xs.toStringHelper}" } } case object Nil extends MyList[Nothing] { // Nil直接返回空列表格式 override def toString: String = "[]" } case class Cons[+A](head: A, tail: MyList[A]) extends MyList[A] { // 利用辅助方法生成元素部分,包裹方括号 override def toString: String = s"[${toStringHelper}]" } object MyList { def apply[A](as: A*): MyList[A] = if (as.isEmpty) Nil else Cons(as.head, apply(as.tail: _*)) def main(args: Array[String]): Unit = { // 现在直接println即可输出目标格式 println(MyList(1, 2, 3)) // 输出 [1, 2, 3] println(MyList()) // 输出 [] println(MyList("a", "b")) // 输出 [a, b] } }
关键说明:
- 实例方法 vs 伴生对象方法:你之前的
toString是伴生对象的私有方法,而println调用的是实例的toString,所以必须把方法定义在trait MyList及其实现类中。 - 利用
this递归处理:在trait的toStringHelper方法里,通过this指代当前列表实例,配合模式匹配递归遍历每个元素,完成字符串拼接。 - 避免重复逻辑:用私有辅助方法
toStringHelper封装递归拼接逻辑,Nil和Cons只需要处理各自的格式收尾即可。
内容的提问来源于stack exchange,提问作者Rosa
相关产品推荐
相关产品推荐

