You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 02:45:01