16

如何覆盖“toString”以使此 Scala 代码的行为类似于以下 Java 代码。

Scala 中的代码

object BIT extends Enumeration {
     type BIT = Value
     val ZERO, ONE, ANY = Value

     override def toString() =
       this match {
       case ANY => "x "
       case ZERO=> "0 "
       case ONE => "1 "
     }
}

val b = ONE
println(ONE)  // returns ONE

想要的 toString 行为应该产生与以下 Java 代码相同的输出。

public enum BIT {
    ZERO, ONE, ANY;

    /** print BIT as 0,1, and X */
    public String toString() {
        switch (this) {
        case ZERO:
            return "0 ";
        case ONE:
            return "1 ";
        default://ANY
            return "X ";
        }
    }
}

BIT b = ONE;
System.out.println(b); // returns 1

我想我覆盖了错误的“toString”方法。

4

2 回答 2

40

首先,是的,您覆盖了错误的 toString 方法。您正在覆盖BIT对象本身的方法,这不是很有用。

其次,您只需简单地做这件事就容易多了

object BIT extends Enumeration {
  type BIT = Value
  val ZERO = Value("0")
  val ONE = Value("1")
  val ANY = Value("x")
}

然后你可以做

println(BIT.ONE) //prints "1"
于 2012-07-12T17:49:02.207 回答
3

如果要设置值和字符串,可以这样做:

scala> object BIT extends Enumeration {
     |   type BIT = Value
     |   val ZERO = Value(0, "0")
     |   val ONE = Value(1, "1")
     |   val ANY = Value("x")
     | }
defined module BIT

scala> BIT.ZERO.toString
res2: String = 0

scala> BIT.ZERO.id
res3: Int = 0

scala> BIT.ANY.id
res4: Int = 2

scala> BIT.ANY.toString
res5: String = x
于 2016-05-09T17:59:45.790 回答