繁体   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