解释奇怪的Scala编译器行为

时间:2011-08-14 08:01:15

标签: eclipse scala compiler-errors

我在Eclipse中使用Scala 2.9.0.1。

我有一个Scala类/特征层次结构,类似于:

A.scala: trait A
B.scala: trait B extends A
C.scala: trait C extends B

除了更复杂;太大了,无法发布。

因此,C间接依赖于A,但A对C没有任何了解。

现在,如果我改变A,我到处都会收到错误,所以我一路上升。一旦我最终修复了C中的最后一个错误,突然编译器告诉我A无法编译。由于A不以任何方式依赖于C,因此这没有逻辑意义。实际上我会说这是一个编译器错误。这种情况现在发生在我身上好几次了,这非常令人沮丧,因为这意味着我必须再次更改A,并再次修改我的整个类层次结构。

有没有办法让Scala编译器(在Eclipse中)给我可靠的结果?我是唯一一个得到这种行为的人吗?

1 个答案:

答案 0 :(得分:2)

我还观察到Scala程序可能存在错误的“层次结构”,其中某些编译错误在其他修复之前不会被揭示。 这不一定是编译器错误其他人说这可能是旧的Scala IDE构建器的一个错误,已在trunk中修复。)

一种策略是逐步进行更改:

  1. 复制trait A并将其称为trait A2
  2. A2进行所需的更改,修复出现的任何编译错误。这很容易,因为还没有任何依赖A2
  3. 重复B2C2
  4. 一切正常后,将原始特征替换为修改过的特征。修订控制(我使用git)在这个过程中非常有用。

    我发现另一个有用的一般策略是将设计分为两个阶段:

    1. 首先,我只对类型进行编码,将所有方法体留空。在任何真正的代码出现之前修复类型错误要容易得多。

    2. 一旦类型一致,我可以独立填写方法定义,而不必担心复杂的编译错误。