この記事を書くに至った経緯
Java8 + Spring Bootで書かれたプログラムを、IntelliJ IDEAで開いて編集していた。 しかし、話題のAIエディタCursorを使用したくて、同じプログラムをCursor(VSCode)で開いてみた。 すると、なぜか大量のエラーが発生し、コンパイルできなくなった。 原因を探るのに1日溶かしてしまったので、戒めとして投稿する。
エラーが起こったコード
要約すると、以下のようなコードである。
package com.example;
import java.util.List;
public class ServiceImpl<V> implements IService<V> {
// 他のメンバ
// IntelliJでは警告になるが、Cursor(VSCode)だとコンパイルエラーになる個所
public List<?> voList(List list) {
return null;
}
}
interface IService<V> {
List<V> voList(List<V> list);
}
上記コメントの通り、問題はpublic List<?> voList(List list)
の部分である。
IntelliJだと警告が出るだけで、問題なくビルドできるのだが、Cursorだとエラーになり、ビルドできない。
本来、上記コードのList<?>
をList<V>
かList
とすれば問題ないのだが、上記コードはclassファイルとなっており、編集できなかった。
そのため、コードを編集することなく、エディタ側の何かしらの設定をいじって対応できないかと考えた。
原因
結論から言うと、この現象はどうやらコンパイラーの違いに起因するらしい。 IntelliJでは標準でjacacが使われているのに対し、Cursor(VSCode)ではEclipseと同じECJが使用される。 javacだと上記コードは警告で済むのに対し、ECJではエラーと判定される、ということらしい。 Cursor(VSCode)でもjavacを使えるようにできるが、JDK23以上でないといけないらしい。 そのため、Java8(JDK1.8)の今回のプロジェクトではCursor(VSCode)でjavacを使うことはできないようだ。
結局どうしたか
Cursorは使用したいが、Cursorからだとコンパイルはできない。 そのため、Cursorで編集しつつ、実行するときはIntelliJを使う、という方針に落ち着いた。 Cursorでファイルを編集するタイミングでビルドが走ってしまうので、IntelliJでリビルドをしてからでないと実行できないというのが面倒だが、現状だと他にどうしようもなさそうだ。