Scala 3 枚举方法覆盖
Scala 3 enum method override
有没有办法像 Java 一样在 Scala 3 枚举中覆盖方法?
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
}
}
也许还有另一种方法可以实现类似的功能?
在 scala 3 中,您可以将 enum
与 extension method
结合使用来获得类似的结果:
enum Test {
case One, Two
}
extension (test: Test)
def calc() : Int = test match {
case Test.One => 1
case Test.Two => 2
}
希望对你有所帮助:)
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
目前看来你想要的是不可能的,但还有其他方法可以做到。您可以尝试使用覆盖 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
必须是一个函数,我会建议第一种方法,或者模式匹配,如果你觉得它更适合你。如果您想重写多个方法,密封特征也是一个不错的选择,因为您不需要单独进行模式匹配或将一堆 lambda 表达式混入构造函数调用中。如果不是函数,我觉得第二个最好。
有没有办法像 Java 一样在 Scala 3 枚举中覆盖方法?
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
}
}
也许还有另一种方法可以实现类似的功能?
在 scala 3 中,您可以将 enum
与 extension method
结合使用来获得类似的结果:
enum Test {
case One, Two
}
extension (test: Test)
def calc() : Int = test match {
case Test.One => 1
case Test.Two => 2
}
希望对你有所帮助:)
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
目前看来你想要的是不可能的,但还有其他方法可以做到。您可以尝试使用覆盖 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
必须是一个函数,我会建议第一种方法,或者模式匹配,如果你觉得它更适合你。如果您想重写多个方法,密封特征也是一个不错的选择,因为您不需要单独进行模式匹配或将一堆 lambda 表达式混入构造函数调用中。如果不是函数,我觉得第二个最好。