eclipse 编译器或 javac 中的 Bug(“无法确定 T 的类型参数”)

2022-08-31 13:32:24

下面的代码

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,不存在唯一的最大实例)。

当我将读取对象(字符串文件)更改为

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

它在 eclipse 和 javac 中编译。谁是正确的,eclipse编译器还是javac?


答案 1

我会说这是Sun编译器中这里这里报告的错误,因为如果你把你的行改成下面的那一行,它适用于两者,这似乎正是错误报告中描述的。

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

答案 2

在这种情况下,我会说你的代码是错误的(Sun编译器是正确的)。输入参数中没有任何内容可以实际推断类型。在这种情况下,最好让它返回 Object,并让客户端手动转换结果类型。readObjectT

这应该有效(尽管我还没有测试过):

public static <T> T readObject(String file) throws Exception {
    return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}

推荐