下面的代码
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谁是对的?
发布于 2008-12-02 23:40:00
发布于 2008-11-24 16:48:55
在这种情况下,我认为您的代码是错误的(而Sun编译器是正确的)。在readObject
的输入参数中没有任何实际推断类型T
的内容。在这种情况下,最好让它返回Object,并让客户端手动转换结果类型。
这应该可以工作(尽管我还没有测试过它):
public static <T> T readObject(String file) throws Exception {
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
}
发布于 2011-03-29 20:45:08
Oracle JDK6 u22应该是正确的,但我使用JDK6 u24也遇到了这个问题
这是eclipse bug 98379的一个错误。
这个问题没有得到纠正,但是这个问题可以通过类似于eclipse but中的例子(参见链接)来解决。
https://stackoverflow.com/questions/314572
复制相似问题