簡體   English   中英

將對象投射到列表會導致未經檢查的投射警告

[英]Casting Object to List results in unchecked cast warning

我想將Object List<IAnalysisData>List<IAnalysisData> 該對象已從數據庫中讀取。 但是,我收到一個煩人的警告,說演員表未經檢查。

private List<IAnalysisData> deserialize(byte[] bytes) throws IOException, ClassNotFoundException
{
    List<IAnalysisData> analysisDataList = null;
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    ObjectInputStream oos = new ObjectInputStream(in);
    Object o = oos.readObject();

    analysisDataList = (List<IAnalysisData>) o; //warning here
    return analysisDataList;
}

投射對象的正確方法是什么?

編輯:我忘了提到IAnalysisData是一個接口。 該實現稱為AnalysisData

我知道要修復類似問題的唯一方法是添加

@SuppressWarnings("unchecked")

即使您絕對“知道”這是安全的,也無法證明自己在做什么是真的安全。

所以看起來像

@SuppressWarnings("unchecked")
private List<IAnalysisData> deserialize(byte[] bytes) throws IOException, ClassNotFoundException
{
    List<IAnalysisData> analysisDataList = null;
    ByteArrayInputStream in = new ByteArrayInputStream(bytes);
    ObjectInputStream oos = new ObjectInputStream(in);
    Object o = oos.readObject();

    analysisDataList = (List<IAnalysisData>) o; //warning here
    return analysisDataList;
}

在那之后,您將不會在該方法中收到任何未經檢查的警告。

無法檢查強制類型轉換為泛型類型。 您可以使用instanceof確認Object o確實是List<?>但不能確認它是List<IAnalysisData> 為了安全起見,您可以使用try / catch塊來捕獲ClassCastException ,但這仍然不會隱藏IDE警告。 就像安德魯所說的那樣,將@SuppressWarnings("unchecked")放在該方法之上將單獨隱藏該方法的警告,但是從長遠來看,IDE警告@SuppressWarnings("unchecked")沒有任何意義。

您的轉換語法很好。

您應該檢查analysisDataList不為null ,這表示轉換成功。 這就是您的IDE告訴您的。

如果在多個地方使用它,請將其編碼為單獨的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM