为什么scala编译器有时会在;“模式匹配”;,有时不是吗?

为什么scala编译器有时会在;“模式匹配”;,有时不是吗?,scala,pattern-matching,Scala,Pattern Matching,首先定义一个列表: val list = List(1,2,3) Scala编译器给出警告(即使它可以匹配): Scala编译器不会给出警告(即使它不匹配): 我无法理解第二个只有当模式匹配是密封的类的类型,并且您只有子类或对象的子集时,才会给出“匹配可能不彻底”警告List是一个密封类,它有一个子类:和一个子对象Nil,类似于: sealed abstract class List[+T] class ::[+T] extends List[+T] object Nil extends Li

首先定义一个列表:

val list = List(1,2,3)
Scala编译器给出警告(即使它可以匹配):

Scala编译器不会给出警告(即使它不匹配):

我无法理解第二个

只有当模式匹配是
密封的
类的类型,并且您只有子类或对象的子集时,才会给出“匹配可能不彻底”警告
List
是一个密封类,它有一个子类
和一个子对象
Nil
,类似于:

sealed abstract class List[+T]
class ::[+T] extends List[+T]
object Nil extends List[Nothing]
如果您有一个
匹配项
,并且没有一个案例用于
,一个案例用于
,并且没有一个案例可能匹配任何
列表
,Scala知道匹配项并不详尽,并将报告它。
案例
将匹配任何内容并阻止警告。但是
List(a,b)
也阻止了警告,因为Scala不知道它是否只匹配一些子类

当您使用
List
作为提取器时,就像在
List(a,b)
中一样,您正在使用提取器
List.unplyseq
来分离匹配的值。Scala不尝试对提取器的行为进行假设,因此不知道匹配不是详尽无遗的。如果不知道
List.unplyseq
的实现细节,就无法知道它不会很好地匹配所有内容并返回所需的两个值

list match {
  case List(a,b) => println("!!!")
}
sealed abstract class List[+T]
class ::[+T] extends List[+T]
object Nil extends List[Nothing]