0

我想编写一个从二进制文件中读取对象的方法,但我想使用泛型对其进行概括。

我有这个代码:

@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile (String filename){
T obj = null;

if (FileUtils.existsFile (filename)){
    ObjectInputStream ois = null;
    try{
        ois = new ObjectInputStream (new FileInputStream (filename));
        obj = (T)ois.readObject ();
    }catch (IOException e){
        Debug.out (e);
    }catch (ClassNotFoundException e){
        Debug.out (e);
    }finally{
        try{
            if (ois != null) ois.close();
        }catch (IOException e){
            Debug.out (e);
        }
    }
}

return obj;

}

当我执行它时,我得到一个 ClassCastException。我对java中的模板一无所知,所以任何信息都会被理解。我已经阅读了与擦除、编译时间和执行时间相关的内容,但我不太明白为什么会得到这个 ClassCastException。

谢谢。

编辑:我这样调用方法:( FileUtils.readFromBinaryFile (filename);没有“”)

4

3 回答 3

2

Java中有模板吗?只需使用 Object 而不是 T。在 Java 中,一切都从基础的 Object 派生,因此您不需要 T obj 而是 Object obj。

于 2011-01-07T22:57:47.900 回答
2

ClassCastException 表示您读取的类型与您期望的类型不匹配(并转换为)我建议您查看在调试器(或日志消息)中读取的对象,并将其与您的期望进行比较。

于 2011-01-07T23:00:59.753 回答
1

你打电话给你的方法是错误的。这样做:

FileUtils.readFromBinaryFile (filename); 

你所说的是所谓的泛型方法。

“我们不必将实际类型参数传递给泛型方法。编译器根据实际参数的类型为我们推断类型参数。它通常会推断出最具体的类型参数,这将使调用类型-正确的。” 来源

编辑:

我已经尝试过你的例子并且它有效(我实际上已经评论了一些行)

    private static String filename = "number.serialized";

    public static void main(String[] args) {
        Double d = 3.14;
        writeToBinary(d, filename);
        Double readD = readFromBinaryFile(filename);
        System.out.println(readD);
    }

    @SuppressWarnings ("unchecked")
    public static <T> T readFromBinaryFile(String filename) {
        T obj = null;
        File file = new File(filename);
        if (file.exists()) {
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(new FileInputStream(filename));
                obj = (T)ois.readObject();
            } catch (IOException e) {
            } catch (ClassNotFoundException e) {
            } finally {
                try {
                    if (ois != null)
                        ois.close();
                } catch (IOException e) {
                }
            }
        }
        return obj;
    }

    public static <T> void writeToBinary(T obj, String filename) 
    {
        try {
            FileOutputStream fis = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(fis);
            oos.writeObject(obj);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
于 2011-01-08T02:03:00.410 回答