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

时间:2008-11-24 15:59:15

标签: java eclipse generics

以下代码

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(String file)更改为

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

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

5 个答案:

答案 0 :(得分:66)

我说这是Sun编译器中报告的herehere中的错误,因为如果你将你的行更改为下面的行,它就可以兼顾两者,这似乎正是所描述的在错误报告中。

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

答案 1 :(得分:13)

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

这应该有用(虽然我没有测试过):

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

答案 2 :(得分:3)

Oracle JDK6 u22应该是正确的,但我也有JDK6 u24这个问题

这是eclipse bug 98379的错误。

这没有得到纠正但问题是通过解决方法解决的,例如eclipse错误中的示例(参见链接)

答案 3 :(得分:1)

我在java版本&#34; 1.6.0_22&#34;中发现了这个问题。当我升级到java版本时,它就消失了#1.6; 1.6.0_32&#34;因为它已在更新25中修复。

答案 4 :(得分:0)

如果您可以修改方法readObject以在调用时透明地工作,您还可以使用以下命令:

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

这样,调用者被迫指定结果的类型,编译器知道如何转换结果。