Scala调用Seq.empty[Int]()方法失败,创建类属性遇报错求助
问题分析与解决
首先我们来拆解你遇到的几个错误,以及背后的核心原因:
1. 语法错误的根源
你的代码private val _1d_matrix : Seq.empty[Int]()存在三个关键问题:
- 类型声明混淆:
Seq.empty[Int]是一个具体的空Seq实例,不是类型。变量的类型应该写为Seq[Int]——这才是序列的抽象类型定义。 - 多余的括号误用:
Seq.empty[Int]本身就是调用Seq伴生对象的empty方法获取空序列,不需要额外加()。加括号会让编译器误以为你要在一个值后面调用无参数方法,但当前上下文是变量初始化,语法完全不匹配,因此会报出"; or newline is expected"这类错误。 - 需求不匹配:你想要的是用0填充的矩阵,但
empty返回的是空序列,没有任何元素,这和你的目标完全不符。
2. 关于"Seq是对象但不能用"的疑问
你说得没错,Seq确实有一个伴生对象(同时它本身是trait),这个伴生对象也确实提供了empty方法,但你的错误不是因为不能用Seq的伴生对象,而是语法使用错误:把实例当成了类型,还错误地追加了括号。
3. 正确的实现方式
如果要创建一个长度为width、全是0的Seq[Int],应该使用Seq伴生对象提供的fill方法,正确代码如下:
class Calc(val width: Int) { private val _1d_matrix: Seq[Int] = Seq.fill(width)(0) }
如果只是想创建一个空的Seq[Int](虽然这不是你的需求),正确写法是:
private val _1d_matrix: Seq[Int] = Seq.empty[Int] // 或者更简洁的写法,编译器可以自动推导类型 private val _1d_matrix = Seq.empty[Int]
补充小提示
Scala里调用伴生对象方法时要注意:
- 无参数方法可以省略括号(比如
Seq.empty[Int]),加括号也合法(Seq.empty[Int]()),但通常省略更符合Scala风格。 - 要严格区分类型和实例:类型是
trait或class(比如Seq[Int]),实例是通过伴生对象方法或构造器创建的具体值(比如Seq.fill(5)(0))。
内容的提问来源于stack exchange,提问作者JarsOfJam-Scheduler
相关产品推荐
相关产品推荐

