Scala中Some类型匹配分支不可达代码警告原因咨询
为什么会出现"unreachable code"警告?
嘿,这个问题其实和JVM的类型擦除特性直接挂钩,咱们一步步说清楚:
先看你的代码:
val what: Option[Any] = Some("dab") what match{ case a : Some[Int] => "its int" case b : Some[String] => "its string" case None => "42" }
核心原因:JVM的泛型类型擦除
Scala跑在JVM上,而JVM的泛型是「擦除式」的——简单说就是,编译之后,泛型的具体类型参数(比如Some[Int]里的Int、Some[String]里的String)会被抹掉,运行时JVM根本看不到这些泛型信息。
那放到你的匹配逻辑里:
- 编译完成后,
Some[Int]和Some[String]都会被处理成同一个类型:Some(不带泛型参数)。 - 所以第一个case
case a : Some[Int],在运行时实际是匹配所有的Some实例——不管它原本装的是Int还是String,只要是Some就会被这个case捕获。
这样一来,第二个case case b : Some[String]就彻底没机会被执行了——所有Some的情况都被第一个case抢着匹配了,编译器当然会告诉你这是「不可达代码」。
哪怕你把what赋值成Some("dab")(字符串类型),运行时JVM只知道它是个Some,依然会触发第一个case,轮不到第二个。
额外小提示:如果想区分泛型类型怎么办?
要是你真的需要在运行时区分Some[Int]和Some[String],可以直接在case里判断值的类型,比如:
def matchOption(opt: Option[Any]): String = opt match { case Some(x: Int) => "its int" case Some(x: String) => "its string" case None => "42" }
这个写法是直接匹配Some里的值的类型,就不会有擦除的问题啦。
内容的提问来源于stack exchange,提问作者frostcs
相关产品推荐
相关产品推荐

