Eclipse内蔵コンパイラとSunのJDKの違い

Eclipseに内蔵されているJavaコンパイラは、SunのJDKのものとは異なる。

そのため、ときおり挙動の異なる部分が見つかることがある。たとえば以下。

class Test {
  public static void main(String args[]) {
    Long l = 0L;
    Double d = 100.0;
    l += d; //エラー
  }
}

上記のコードは、EclipseではコンパイルできるがJDK付属のjavacではコンパイルできない。

また、Genericsを使用した下記のコードも、Sunのコンパイラではエラーになる。

class GenericsTest {
  public static void main(String args[]) {
    List list = createTypedClass(String.class); //エラー
  }
  public static List createTypedClass(Class< U > c) {
    return new ArrayList();
  }
}

どっちの挙動が正しいのだろう?

いずれにしてもワークベンチ上でコンパイルエラーになっていないからといって、迂闊にリポジトリにコミットするとJDKコンパイルできないコードが混入してしまうので注意が必要だ。