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

下面的代码

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,没有唯一的最大实例,上限为T,java.lang.Object)。

当我将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?


我想说这是Sun编译器在这里和这里报告的错误,因为如果您将行更改为下面的行,它就可以与两者一起使用,这似乎正是bug报告中所描述的。

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

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

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

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

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

这是eclipse bug 98379的一个bug。

这个问题没有得到解决,但是问题通过解决方法来解决,例如eclipse bug中的示例(请参阅链接)

链接地址: http://www.djcxy.com/p/79951.html

上一篇: Bug in eclipse compiler or in javac ("type parameters of T cannot be determined")

下一篇: LinearLayout and FrameLayout multiple errors in Android Studio