首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala 3枚举方法重写

Scala 3枚举方法重写
EN

Stack Overflow用户
提问于 2021-04-25 03:48:03
回答 3查看 244关注 0票数 3

有没有一种方法可以像Java一样覆盖Scala3枚举中的方法?

代码语言:javascript
运行
复制
public enum Test {

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

    public abstract int calc();
}

我试过这样的方法,但没有结果。在文档中也没有找到任何关于枚举方法覆盖的东西。

代码语言:javascript
运行
复制
enum Test {
  def calc(): Int ={
    0
  }
  case One
    override def calc(): Int ={
      1
    }
  case Two
    override def calc(): Int ={
      2
    }
}

也许还有另一种方法可以实现类似的功能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-25 04:21:39

看起来你想要的东西目前是不可能的,但还有其他方法可以做到。您可以尝试使用覆盖calc的对象的老式密封特征。

代码语言:javascript
运行
复制
sealed trait Test:
  def calc: Int
object One extends Test:
  def calc = 1
object Two extends Test:
  def calc = 2

函数calc也可以作为Test的一个参数,尽管我不太喜欢这种方法。

代码语言:javascript
运行
复制
enum Test(calc: () => Int):
  case One extends Test(() => 1)
  case Two extends Test(() => 2)

另一种方法是通过单一的方法和模式匹配,就像gianluca aguzzi和Andrey Tyukin所做的那样,尽管扩展方法是不必要的。

如果calc必须是一个函数,我会推荐第一种方法,或者模式匹配,如果你觉得它更适合你的话。如果您想覆盖多个方法,那么密封的特征也是一个很好的选择,因为您不需要单独进行模式匹配,也不需要在构造函数调用中包含一堆lambda。如果它不是一个函数,我觉得第二个是最好的。

票数 3
EN

Stack Overflow用户

发布于 2021-04-25 04:20:58

enum是密封的,所以它不能在事后扩展,所以没有理由override任何东西。只需将所有案例收集到一个位置,而不是多个override-methods,而是编写一个涵盖所有案例的方法:

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 2021-04-25 04:11:58

在Scala3中,您可以结合使用enumextension method来实现类似的结果

代码语言:javascript
运行
复制
enum Test {
  case One, Two
}

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

我希望我对您有所帮助:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67246842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档