从子类型到超类型的 ClassCastException(在 Scala 中)

ClassCastException from subtype to supertype (in scala)

我们只在一台开发机器上始终遇到一个奇怪的错误,对于其他机器它工作正常(我个人无法重现该问题):

Caused by: java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to scala.collection.Seq
    at scala.Option.map (Option.scala:163)
    at com.lightbend.lagom.maven.RunAllMojo.$anonfun$execute (ServiceMojos.scala:402)

Seq 是每个 https://www.scala-lang.org/api/2.12.0/scala/collection/immutable/$colon$colon.html:: ($colon$colon) 的线性超类型。我们将 Lagom 1.6.0-M2 用于 Java DSL,以及 Scala 2.12。 Java版本:

openjdk version "1.8.0_212"
OpenJDK Runtime Environment Corretto-8.212.04.2 (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM Corretto-8.212.04.2 (build 25.212-b04, mixed mode)

它发生在 lagom 开发服务器期间 bootstrap。清除并重新下载 maven 存储库(尤其是 scala-lang 和 lagom deps)并没有解决这个问题,所以这可能不是由于文件损坏造成的。

我将我机器上的 Scala 罐子与坏机器上的 Scala 罐子进行了比较,它们是一样的。

什么会导致从子类型到超类型的 ClassCastException,我们应该从哪里开始调查这个问题?

这是一个类加载器问题

核心问题是 Maven 插件使用了 <extensions>true</extensions> 配置,这不知何故搞乱了类加载器。

实际问题已解决,删除扩展标志解决了问题:

https://discuss.lightbend.com/t/java-lang-classcastexception-scala-collection-immutable-colon-colon-cannot-be-cast-to-scala-collection-seq-during-runall/4821/3