首页 文章

Scala中最终类和密封类之间有什么区别?

提问于
浏览
44

Scala中有两种类型的修饰符: finalsealed

它们之间有什么区别?什么时候应该使用另一个?

2 回答

  • 7

    final 类无法扩展,期限 .

    sealed 特征只能在与声明的源文件相同的源文件中扩展 . 这对于创建ADT(代数数据类型)很有用 . ADT由其派生类型的总和定义 .

    例如 . :

    • Option[A]Some[A] None 定义 .

    • A List[A]:: Nil 定义 .


    sealed trait Option[+A]
    
    final case class Some[+A] extends Option[A]
    object None extends Option[Nothing]
    

    因为 Option[A] 是密封的,所以它不能被其他开发者扩展 - 这样做会改变它的含义 .

    Some[A] 是最终的,因为它无法延长,期间 .


    另外一个好处是,如果特征是密封的,编译器可以警告您,如果您的模式匹配不够详尽,因为它知道 Option 仅限于 SomeNone .

    opt match {
        case Some(a) => "hello"
    }
    

    警告:匹配可能并非详尽无遗 . 它将在以下输入上失败:无

  • 82

    sealed 类(或特征)仍然可以在同一个源文件中继承(其中 final 类根本不能继承) .

    如果要限制基类的子类数,请使用 sealed (请参阅"Algebraic Data Type") .

    作为这种限制的一个非常实际的好处,编译器现在可以警告你关于非执行模式匹配:

    sealed trait Duo
    case class One(i:Int) extends Duo
    case class Two(i:Int, j:Int) extends Duo
    
    def test(d:Duo) {
      match {
        case One(x) => println(x) // warning since you are not matching Two
      }
    }
    

相关问题