2011-03-05 40 views
14

我得到一個「類型安全:未選中從對象轉換爲ArrayList的」與的readObject()行警告,在這個代碼片段:未經檢查的投射警告 - 如何避免這種情況?

// Read the Event List 
theEventArrayList = new ArrayList<Event>();   
String FILENAME = "EventData.dat"; 
FileInputStream fis; 
try { 
    fis = openFileInput(FILENAME); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    theEventArrayList = (ArrayList<Event>) ois.readObject(); 
    fis.close(); 
} 

Event是由一個簡單的類一些字符串,日曆,布爾值和整數。 ArrayList是在上面的鏡像操作中使用ObjectOutputStream編寫的。這個代碼被使用的應用程序每天執行很多次,一個多月沒有失敗,但是編譯器警告讓我困擾,而且我不想只是在可以正確「檢查」的情況下將其壓制。

+0

你爲什麼不想要抑制它?你顯然確信它是完全合法的,所以只需關閉編譯器:)黑客/變通辦法只會使代碼不易維護。 – BalusC 2011-03-05 04:00:01

回答

25

壓制它。你唯一的選擇是投射到ArrayList,但在你的代碼中的其他任何地方,你必須處理無類型的ArrayList並在讀取時進行投射。在這種情況下壓制並沒有什麼壞處。

4

那麼編譯器是正確的 - 誰說你讀的對象真的是一個ArrayList?我可以很容易地用完全不同的東西替換文件,你會得到一個異常。

Object obj = ois.readObject(); 
if (obj instanceof ArrayList) 
    // do something 
else 
    // Error 

應該工作。是的,你仍然會得到一個警告,因爲通用的,但那是Java的通用系統,擺脫這將意味着創建一個新的對象,並一次添加一個事件 - 呃,但我們必須將對象事件和..啊,不,不是更好,只是生活在一般的警告。

1

舊的,但我同樣的醇''谷歌到這裏「迴應。

如果你想避免它,並沒有真正與CPU或內存限制徵稅,你可以嘗試Collections.copy

相關問題