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