我试图解决99 个 Scala 问题中的第 7 个问题,但在找出List
可以包含任何类型的 a 类型时遇到了一些困难。所以我看了看答案,发现它是List[Any]
。我开始编写一个实现,如下所示:
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs =>
(if (x.isInstanceOf[List[Any]]) { flatten(x) } else { List(x) }) :::
flatten(xs)
}
但是,这给了我以下编译错误:
[error] <filename omitted>:<line number omitted>: type mismatch;
[error] found : Any
[error] required: List[Any]
[error] (if (x.isInstanceOf[Any]) { flatten(x) } else {List(x) })
[error] ^
[error] one error found
更改isInstanceOf[List[Any]]
为isInstanceOf[List[_]]
会产生相同的编译错误。
在谷歌搜索和咨询这个解决方案之后,我实现了这个:
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs => x match {
case x: List[_] => flatten(x) ::: flatten(xs)
case _ => x :: flatten(xs)
}
}
效果很好。那么为什么 Scala 编译器认为它x
具有类型Any
,为了进入该块,它必须通过x.isInstanceOf[Any]
,这使它成为类型List[Any]
?这是编译器错误,还是我不理解的 Scala 的某些部分?
谢谢!