【发布时间】:2020-07-27 21:02:10
【问题描述】:
我只是想在下面的示例中检查任何类型 T 的出现。尽管(try me) 断言失败:
val seq = List(AcceptableRisk, UnacceptableRisk)
def any[T] =
seq.collect { case x: T => x }.nonEmpty
assert(any[UnknownRisk] == false)
trait Risk
case class AcceptableRisk() extends Risk
case class UnacceptableRisk() extends Risk
case class UnknownRisk() extends Risk
有编译警告:
jdoodle.scala:5: warning: abstract type pattern T is unchecked since it is eliminated by erasure seq.collect { case x: T => x }.nonEmpty ^
为什么会失败?
【问题讨论】:
-
这通常是代码异味,表明某处存在设计错误。
-
是否有任何推荐的方法来检查异构集合中的类型出现?我不想在已知 T 的多个地方直接调用
collect和nonEmpty。 -
一开始就没有异构集合。如何解决这个问题并没有直接简单的答案,但是每次有人说我有一个异构集合并且我需要提取一些任意类型时,这意味着之前的某个地方存在设计错误。
-
你能给我指出任何一种关于这方面的文献吗?集合内容上的类型驱动模式匹配有什么问题?我敢打赌,项目暴露特定特征以进行过滤和相应处理是完全可以的。我们只让屏幕上的某些控件可以被鼠标点击,这并没有违反 LSP。
-
任何异构都是 List[Any] 或接近的,这在 Scala 中是不好的做法,因为你真的不能用它们做那么多。由于擦除,按类型匹配的模式并不总是有效。例如,如果您将
List[String]作为T传递,它仍将匹配内部List[Int]和List[Boolean]以及任何类型的列表。现在,如果你的T只能是Risk的子类型,那么这一切都没有任何意义,只是seq.exist(_ == UnacceptableRisk)
标签: scala scala-2.13