1. ホーム
  2. java

eclipseコンパイラやjavacのバグ(「Tの型パラメータが決定できない」)。

2023-10-27 03:02:25

質問

次のコード

public class GenericsTest2 {

    public static void main(String[] args) throws Exception {
        Integer i = readObject(args[0]);
        System.out.println(i);
    }

    public static <T> T readObject(String file) throws Exception {
        return readObject(new ObjectInputStream(new FileInputStream(file)));
        // closing the stream in finally removed to get a small example
    }

    @SuppressWarnings("unchecked")
    public static <T> T readObject(ObjectInputStream stream) throws Exception {
        return (T)stream.readObject();
    }
}

はeclipseではコンパイルできますが、javacではコンパイルできません(Tの型パラメータが決定できない。上界T,java.lang.Objectを持つ型変数Tに対して一意の最大インスタンスが存在しない)。

readObject(文字列ファイル)を

    @SuppressWarnings("unchecked")
    public static <T> T readObject(String file) throws Exception {
        return (T)readObject(new ObjectInputStream(new FileInputStream(file)));
    }

を実行すると、eclipseでもjavacでもコンパイルされます。eclipseのコンパイラとjavacのどちらが正しいのでしょうか?

どのように解決するのですか?

Sunのコンパイラのバグが原因だと思います。 ここで はこちら というのは、あなたの行を以下の行に変更すると、両方で動作するからで、これはまさにバグレポートに記述されていることだと思われます。

return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));