我正在学习Scala,我正在尝试为项目设置一个简单的枚举设置。我已经检查了一些示例,似乎没有一个示例,Scala文档和StackOverflow中的所有示例都是针对 objects 中的枚举,而不是类。我收到了一个我不明白的IDE警告。我是从初学者Java背景进入Scala,这可能是我混乱的原因。
以下是代码:
class Car(maxSpeed: Integer) {
// Enums
object CarType extends Enumeration {
type CarType = Value
val PERIPHERAL, COMPUTER, EMPTY = Value
}
import CarType._
// Fields
val repeated: CarType
}
当我将鼠标移到班级名称上时,我可以看到这个Intellij警告:
类'Car'必须被声明为abstract或实现抽象成员'typed:'Car'中的Car.this.CarType.CarType'
我不确定为什么它要我实现我的变量,而且这个类并不是抽象的。我想像在Java中使用它们一样使用Enums。
答案 0 :(得分:5)
将枚举移到课堂外:
// Enums
object CarType extends Enumeration {
type CarType = Value
val PERIPHERAL, COMPUTER, EMPTY = Value
}
class Car(maxSpeed: Integer) {
import CarType._
// Fields
val repeated: CarType
}
或将其移至companion对象:
class Car(maxSpeed: Integer) {
import Car.CarType._
// Fields
val repeated: CarType
}
object Car {
object CarType extends Enumeration {
type CarType = Value
val PERIPHERAL, COMPUTER, EMPTY = Value
}
}
问题在于,在类里面定义的东西的范围是该类的实例(与其他一些语言不同)。
那就是说,我建议使用代数数据类型而不是枚举:
sealed trait CarType
object CarType {
case object Peripheral extends CarType // strange choice of names
case object Computer extends CarType
case object Empty extends CarType
}
case class Car(maxSpeed: Int, carType: CarType)
答案 1 :(得分:0)
您要找的是Scala Case Class。
class Car(maxSpeed: Integer)
case class Minivan(maxSpeed: Integer) extends Car(maxSpeed: Integer)
case class Hodrod(maxSpeed: Integer) extends Car(maxSpeed: Integer)
case class Coupe(maxSpeed: Integer) extends Car(maxSpeed: Integer)
Scala中并没有真正使用Java中存在的枚举。通过像我上面的结构一样,你可以利用Scala强大的pattern matching做这样的事情:
val unknownCar = getCar() // Some function that gets a car
unknownCar match {
case Minivan => println("Driving the kids")
case Hodrod => println("Tearing up the drag")
case Coupe => println("Riding low")
}
...同时仍允许您将其视为Car
。
因为它们是案例类,所以Scala有很多东西可以帮助你。
请注意documentation for Enumeration:
通常,这些值枚举可以采用的所有可能形式,并为案例类提供轻量级替代。
如果您不打算将这些值用于其他任何事情,那么您应该只使用它 - 但即使是案例类通常也会为您提供更好的服务。