2011-01-07 55 views
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);(没有 “”)

回答

1

你打电话给你的方法错了。 只要做到这一点是这样的:

FileUtils.readFromBinaryFile (filename); 

什么你打电话是所谓的通用方法。

“我们不必将实际的类型参数传递给泛型方法,编译器根据实际参数的类型推断出我们的类型参数,它通常会推断出最具体的类型参数将使呼叫类型正确。“source

编辑:

我试过你的榜样,它工作(我其实有些注释行)

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

在Java中有模板?只需使用Object而不是T.在Java中,一切都从Object的Object派生,所以你不需要T obj而是Object obj。

+0

好,在Java中的模板,但他们使用<>,如在公共静态条目两次(T值) – jun 2011-01-07 23:01:56

+0

也许你的意思是不是像C++中的模板一样的泛型 – 2011-01-07 23:03:13

2

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