1

我是scala的新手,只是在做一些练习;我尝试了一个非常简单的程序,简述如下:

abstract class Device(val cds: Array[Char]) {
  var codes = Array[Char](cds: _*)
  def encrpt(code: Char): Char

  var nextDevice: Device

  def setNext(next: Device):Unit = {
    nextDevice = next
  }
}

//compiler error shows here
class Input(codes: Array[Char]) extends Device(codes) {
  override def encrpt(code: Char) = code
}

您可以在第 21 行看到编译器错误,以下是消息: 类 Input 需要是抽象的,因为未定义类型为 com.me.acm.problem1009.Device 的类 Device 中的变量 nextDevice(请注意,变量需要被初始化被定义)

我很困惑这个错误,我的理解是在父类中定义一些变量和一个setter方法,所以子类可以使用它而无需再次定义它。这是直截了当的。

我想我错过了什么。有人可以向我解释一下并告诉我正确的方法是什么吗?谢谢。

4

2 回答 2

4

在 Scala 中,变量不像在 Java(或许多其他语言)中那样具有默认值。因此,当您声明一个变量时,您必须始终指定它的初始值。

在您的代码中,您声明了一个变量nextDevice,但您没有给它一个值。由于 Scala 始终需要一个值,它会将您编写的内容解释为nextDevice一个抽象字段,因此编译器会告诉您它必须被覆盖。

例如,如果将该行更改为以下内容,以指定初始值,则错误将消失:

var nextDevice: Device = new Input(Array())
于 2013-01-07T06:36:06.847 回答
3

正如错误消息告诉你的那样,变量nextDevice需要在构造函数中初始化Input

class Input(codes: Array[Char]) extends Device(codes) {
  override def encrpt(code: Char) = code
  nextDevice = null
}

请注意,null在 Scala 中使用是不受欢迎的。您可能应该将变量的类型更改为Option[Device]

于 2013-01-07T06:35:34.747 回答