eclipse编译器或javac中的错误(“无法确定T的类型参数”)
下面的代码eclipse编译器或javac中的错误(“无法确定T的类型参数”),java,eclipse,generics,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 {
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();
}
}
公共类GenericsTest2{
公共静态void main(字符串[]args)引发异常{
整数i=readObject(args[0]);
系统输出打印LN(i);
}
公共静态T readObject(字符串文件)引发异常{
返回readObject(newobjectinputstream(newfileinputstream(file));
//关闭最后删除的流以获得一个小示例
}
@抑制警告(“未选中”)
公共静态T readObject(ObjectInputStream流)引发异常{
返回(T)stream.readObject();
}
}
在eclipse中编译,但不使用javac(无法确定T的类型参数;不存在具有上界T的类型变量T的唯一最大实例,即java.lang.Object)
当我将readObject(字符串文件)更改为
@SuppressWarnings(“未选中”)
公共静态T readObject(字符串文件)引发异常{
返回(T)readObject(新ObjectInputStream(新FileInputStream(file));
}
它使用eclipse和javac进行编译。谁是对的,eclipse编译器还是javac?在本例中,我认为您的代码是错误的(Sun编译器是对的)。
readObject
的输入参数中没有任何东西可以实际推断类型T
。在这种情况下,最好让它返回对象,并让客户端手动强制转换结果类型
这应该是可行的(尽管我还没有测试过):
publicstatict读取对象(字符串文件)引发异常{
返回GenericsTest2.readObject(新ObjectInputStream(新FileInputStream(file));
}
我认为这是Sun编译器中报告的错误,因为如果您将行更改为下面的行,它将同时处理这两个错误,这似乎正是错误报告中描述的
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
返回GenericsTest2.readObject(新ObjectInputStream(新FileInputStream(file));
Oracle JDK6 u22应该是正确的,但我对JDK6 u24也有这个问题
这是eclipse的一个bug
这一点没有得到纠正,但通过类似eclipse bugs(请参见链接)中的示例的变通方法解决了问题。如果您可以修改方法readObject,使其在调用时透明工作,您还可以使用以下方法:
public static <T> T readObject(String file, Class<T> type) throws Exception {
return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}
publicstatict readObject(字符串文件,类类型)引发异常{
返回类型.cast(readObject(新ObjectInputStream(新FileInputStream(file)));
}
这样,调用者就必须指定结果的类型,编译器知道如何强制转换结果。我在java版本“1.6.0_22”中发现了这个问题。当我升级到java版本“1.6.0_32”时,它消失了,因为它在更新25中得到了修复。返回GenericsTest2.readObject(newobjectinputstream(newfileinputstream(file));确实有效。谢谢我不同意,它看起来更像下面的bug。编译器应该信任没有类型推断的显式强制转换-下面编译fine@SuppressWarnings(“unchecked”)public static T createT(String className)抛出异常{return(T)Class.forName(className).newInstance();}
return GenericsTest2.<T>readObject(new ObjectInputStream(new FileInputStream(file)));
public static <T> T readObject(String file, Class<T> type) throws Exception {
return type.cast(readObject(new ObjectInputStream(new FileInputStream(file))));
}