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

The following code

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();
    }
}

compiles in eclipse, but not with javac (type parameters of T cannot be determined; no unique maximal instance exists for type variable T with upper bounds T,java.lang.Object).

When I change readObject(String file) to

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

it compiles in eclipse and with javac. Who is correct, the eclipse compiler or javac?


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

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

In this case, I'd say your code is wrong (and the Sun compiler is right). There is nothing in your input arguments to readObject to actually infer the type T . In that case, you're better off to let it return Object, and let clients manually cast the result type.

This should work (though I haven't tested it):

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

Oracle JDK6 u22 should be correct but I've this problem with JDK6 u24 too

This is a bug of eclipse bug 98379.

This was not corrected but the problem is resolved via workaround like example in eclipse bugs (see link)

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

上一篇: 如何使用JMXWS WS连接器(JSR)启动VisualVM

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