scala 3枚举方法重写

hc2pp10m  于 2021-07-14  发布在  Java
关注(0)|答案(3)|浏览(434)

有没有一种方法可以像java一样重写Scala3Enum中的方法?

public enum Test {

    ONE {
        @Override
        public int calc() {
            return 1;
        }
    },
    TWO {
        @Override
        public int calc() {
            return 2;
        }
    };

    public abstract int calc();
}

我试过这样的方法,但没有结果。在文档中也没有找到任何关于枚举方法重写的信息。

enum Test {
  def calc(): Int ={
    0
  }
  case One
    override def calc(): Int ={
      1
    }
  case Two
    override def calc(): Int ={
      2
    }
}

或许还有其他方法可以实现类似的功能?

pcww981p

pcww981p1#

似乎你想要的是目前不可能的,但有其他的方法可以做到这一点。你可以尝试一种老式的密封特征,它可以覆盖 calc .

sealed trait Test:
  def calc: Int
object One extends Test:
  def calc = 1
object Two extends Test:
  def calc = 2

函数 calc 也可以作为 Test ,虽然我不太喜欢这种方法。

enum Test(calc: () => Int):
  case One extends Test(() => 1)
  case Two extends Test(() => 2)

另一种方法是通过单一方法和模式匹配,就像gianluca aguzzi和andrey tyukin所做的那样,尽管不需要扩展方法。
如果 calc 必须是一个函数,我会建议第一种方法,或模式匹配,如果你觉得它更适合你。如果要重写多个方法,sealed traits也是一个不错的选择,因为不需要单独进行模式匹配,也不需要将一堆lambda聚集到构造函数调用中。如果不是一个函数,我觉得第二个最好。

pieyvz9o

pieyvz9o2#

这个 enum 是密封的,所以事后不能延期,所以没有理由延期 override 什么都行。只需在一个地方收集所有案例,而不是多个 override -方法,编写一个涵盖所有案例的方法:

enum A:
  case X(x: Int)
  case Y(y: String)
  def foo: String = this match {
    case X(x) => s"X = ${x}"
    case Y(y) => y
  }

val x = new A.X(42)
val y = new A.Y("y")
println(x.foo) // X = 42
println(y.foo) // y
jv4diomz

jv4diomz3#

在scala 3中,您可以通过组合 enumextension method :

enum Test {
  case One, Two
}

extension (test: Test)
  def calc() : Int = test match {
    case Test.One => 1
    case Test.Two => 2
  }

我希望我能帮助你:)

相关问题