2011-01-07 53 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表示您閱讀的類型與您期望的類型不匹配(並且轉換爲)我建議您查看在調試器(或日誌消息)中讀取哪個對象並將其與您所在的系統進行比較期待。