我在Android上为Scala整理了一个小型序列化库(Parcelable)。但是我一直在努力解决看起来失败的Coproduct相关类型类,具体取决于文件名(?)。
我在编写tests时首次遇到此问题。有一个包含密封特征层次结构的简单文件Animal.scala
。测试编译正常,一切都按预期工作,但是一旦我将文件名更改为ZAnimal.scala
,测试套件就无法编译,因为无法再解析Coproduct类型类实例。
此问题仅适用于Coproduct类型类,与案例类相关的类型类不会中断。
不幸的是,这也影响了依赖于.widget
中的ADT无法解决的库的项目。将它们移至.aaa
可以解决问题。
我担心这可能是由底层宏代码引起的,编译器很快就无法发现某些类型(可能与scalamacros/paradise#14有关?)。但我绝对更喜欢我的库代码中的错误。
编辑:我已经整理了一个small sample project,可以更准确地说明问题。
答案 0 :(得分:0)
Miles Sabin在Gitter上解释说这与SI-7047有关。
您将看到此编译器错误(影响所有枚举所有子类的尝试,基于宏或其他方式):https://issues.scala-lang.org/browse/SI-7046
如果将ADT放在源文件中,该文件将在需要枚举其子类的代码之前编译,那么您应该没问题。
这通常是ADT在一个单独的模块中所满足的。
源文件名的字典顺序对编译顺序有影响...特别是
Animal.scala
将在ZAnimal.scala
之前编译。
避免此问题的一种安全方法是将受影响的代码移动到单独的子模块中。这样,编译器在解析消费模块中的类型类时发现了所有类型。