从 Scala 枚举中获取值

getting Value from scala enumeration

说我有这样的枚举

object SimpleEnum extends Enumeration{
 val ONE = Value(1)
 val TWO = Value(2)
 val THREE = Value(3)
 etc...
}

我还有一个 class 我想扩展 Ordered[SimpleEnum]

class SimpleClass(se: SimpleEnum) extends Ordered[SimpleEnum] {
  override def compare(that: SimpleEnum): Int = this.se.[here i want to get instance of SimpleEnum, just like i used to do in java, but unfortunately it's not possible]
}

所以在 SimpleClass 中,我只需要获取附加到相应 SimpleEnum val 的值。

在 java 中,我能够在枚举上声明一个变量,并通过这个 var 访问对应于它的实际值,在 scala 中,我正在寻找一种方法来获取枚举的实例并达到出其价值。

可以,使用id方法。

scala> object E extends Enumeration { 
  val A = Value(1)
  val B = Value(7)
  val C = Value(2)
}
defined object E

scala> E.A.id
res7: Int = 1

scala> E.B.id
res8: Int = 7

scala> E.C.id
res9: Int = 2

Enumeration 值也可以轻松比较

scala> E.A < E.B
res10: Boolean = true

scala> E.C < E.B
res11: Boolean = true

scala> E.B < E.A
res12: Boolean = false

参考documentation了解更多

编辑

您图片中的代码有误。首先,在您的原始代码中(图片中没有),SimpleEnum 应该是 object,而不是 class。一旦您进行了更改,您的代码将无法编译,这应该敲响警钟。

您希望 SimpleClass 能够包装您的枚举值。这些值的类型(即 ONETWOTHREE)不是 SimpleEnum,而是 SimpleEnum.Value。这种类型的对象有 id 方法。

class SimpleClass(se: SimpleEnum.Value) extends Ordered[SimpleEnum.Value] {
  override def compare(that: SimpleEnum.Value): Int = se.id
}

一个常见的做法是为 Value 声明一个类型别名,其名称与枚举对象完全相同。然后你可以导入这个类型并使用它

object SimpleEnum extends Enumeration {
  type SimpleEnum = Value

  val ONE = Value(1)
  val TWO = Value(2)
  val THREE = Value(3)
}

import SimpleEnum.SimpleEnum

class SimpleClass(se: SimpleEnum) extends Ordered[SimpleEnum] {
  override def compare(that: SimpleEnum): Int = se.id
}

请注意 Enumeration#Value 已经实现了 Ordered[Value]。您可以在我之前链接的文档中验证它。

scala 中没有 classic java enum,但是因为这门语言太酷了,所以可以创建一个名为 Enumeration 通过一些技巧可以实现类似的行为。

问题已经回答了,但我的做法是:

object SimpleEnum extends Enumeration{
 type SimpleEnum = Value
    val ONE = Value(1)
    val TWO = Value(2)
    val THREE = Value(3)
    etc...
}

class SimpleClass(val i : Int){
    def getNumber() {
        import SimpleEnum._
        SimpleEnum(i)
    }
}