scala 随笔(5) sealed 解析

来源:互联网 发布:淘宝众筹赚钱 编辑:程序博客网 时间:2024/06/01 09:12
首先看一段代码,List的定义
  1. sealed abstract class List[+A] extends AbstractSeq[A]
  2. with LinearSeq[A]
  3. with Product
  4. with GenericTraversableTemplate[A, List]
  5. with LinearSeqOptimized[A, List[A]]
  6. with scala.Serializable {

list 所有子类
 可以看到list的所有子类都在
package scalapackage collectionpackage immutable
这个下面。
其实仔细查看可以知道sealed 定义的子类都在List里面。

sealed 定义的所有子类只能在同源代码块里。不能在其他地方继承或者实现,如果你想去实现,会有下面异常
  
那么sealed 有什么用呢,

1)放在被继承或者实现
2)当与标签特征联合使用时,可以用case 遍历所有情况,代码如下:
  1. object Implicit {
  2. def whatFruit(fruit: Fruit) = fruit match {
  3. case Apple => s" I am a Apple"
  4. case Banana => s"I am a Banana"
  5. }
  6. def main(args: Array[String]): Unit = {
  7. var fruit = Apple
  8. println(whatFruit(fruit))
  9. }
  10. }
  11. trait Fruit
  12. case object Apple extends Fruit
  13. case object Banana extends Fruit
  14. case object Orange extends Fruit
  15. object Fruit{
  16. val values = Vector(Apple, Banana,Orange)
  17. }
这里例子中英文match 没有覆盖所有的情况,应该是会报警告的
“match may not be exhaustive”
但当前版本应该是修复这个问题了,没有任何警告

经查证:从2.1.2版本修复,不会出现“match may not be exhaustive”警告了
And it's been patched, c.f. https://github.com/retronym/scala/compare/ticket/5968.

输出为:
"C:\Program Files\Java\jdk1.8.0_40\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2\lib\idea_rt.jar=52956:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_40\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_40\jre\lib\rt.jar;F:\book\spark\learn-spark\target\scala-2.12\classes;C:\Users\Administrator\.ivy2\cache\org.scala-lang\scala-library\jars\scala-library-2.12.2.jar" test.Implicit
 I am a Apple

Process finished with exit code 0

正常输出,

原创粉丝点击