Scala3正式版enum语法规范及枚举类方法重写实现咨询
Scala3 enum语法及问题修复
1. 自定义Option枚举编译错误修改
你使用的是早期Dotty提案阶段的实验性语法,Scala3正式版已调整enum的标准语法,修改后的可运行代码如下:
enum Option[+T] extends Serializable: // 父类定义抽象方法 def isDefined: Boolean // 所有枚举case直接定义在enum内部 case Some[+T](x: T) extends Option[T]: override def isDefined: Boolean = true case None extends Option[Nothing]: override def isDefined: Boolean = false // 伴生对象单独定义,存放apply等公共方法 object Option: def apply[T](x: T): Option[T] = if x != null then Some(x) else None
主要改动点:
- 去掉
enum后不需要加class关键字 - 枚举
case必须直接定义在enum结构内部,不能放在外部的伴生对象中 - 协变泛型的无参case需要显式声明父类的泛型参数为
Nothing
2. 枚举项单独实现抽象方法
你期望的每个case单独重写方法的写法,在Scala3正式版中是原生支持的,标准写法如下:
import java.io.{InputStream, OutputStream} import java.util.zip.{GZIPInputStream, GZIPOutputStream} import org.apache.commons.compress.compressors.bzip2.{BZip2CompressorInputStream, BZip2CompressorOutputStream} enum CompressionMethod: // 父类定义抽象方法 def compress(out: OutputStream): OutputStream def decompress(in: InputStream): InputStream case GZIP extends CompressionMethod: override def compress(out: OutputStream): OutputStream = GZIPOutputStream(out) override def decompress(in: InputStream): InputStream = GZIPInputStream(in) case BZIP extends CompressionMethod: override def compress(out: OutputStream): OutputStream = BZip2CompressorOutputStream(out) override def decompress(in: InputStream): InputStream = BZip2CompressorInputStream(in) case NONE extends CompressionMethod: override def compress(out: OutputStream): OutputStream = out override def decompress(in: InputStream): InputStream = in
该写法完全满足扩展需求:新增枚举类型时仅需要新增对应case实现抽象方法即可,无需修改原有compress/decompress的代码,无需将所有逻辑集中在match分支中。
内容的提问来源于stack exchange,提问作者esse
相关产品推荐
相关产品推荐

