Match Case的顺序是否有依赖性?Bar继承Foo时handleBar是否不可达?
模式匹配分支可达性问题解答
当Bar extends Foo时,你给出的match表达式里的handleBar分支完全不可达,原因如下:
在主流支持模式匹配的语言(如Kotlin、Scala、Java 17+)中,match分支的匹配逻辑是按书写顺序从上到下依次检查:只要某个分支的类型匹配条件满足,就会立即执行该分支的逻辑,不会再继续检查后续分支。
因为Bar是Foo的子类,所有Bar类型的实例同时也是Foo类型的实例。当x是Bar实例时,第一个分支的is Foo条件会先成立,直接执行handleFoo(x),后面的is Bar分支永远不会被触发。
如果想要让Bar类型的实例被handleBar处理,必须调整分支顺序,把更具体的类型分支放在前面:
match (x) { is Bar -> handleBar(x); is Foo -> handleFoo(x); }
这样Bar实例会优先匹配到第一个分支,而仅属于Foo类型(非Bar子类)的实例才会走到第二个分支。
内容的提问来源于stack exchange,提问作者Mike Samuel
相关产品推荐
相关产品推荐

