将对象转换为列表会导致未选中的强制转换警告

时间:2015-07-21 13:32:27

标签: java casting

我想将Object投射到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

3 个答案:

答案 0 :(得分:3)

我知道解决这类问题的唯一方法就是添加

@SuppressWarnings("unchecked")

即使你绝对知道&#39;也无法证明你所做的事情是否安全。这是。

所以它看起来像

@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;
}

之后,您将在该方法中获得未经检查的警告。

答案 1 :(得分:2)

无法将强制转换检查为泛型类型。您可以使用instanceof确认Object o确实是List<?>,但您无法确认它是List<IAnalysisData>。为了安全起见,您可以使用try / catch块来捕获ClassCastException,但这仍然不会隐藏IDE警告。就像安德鲁所说的那样,将@SuppressWarnings("unchecked")置于方法之上将仅隐藏此方法的警告,但从长远来看,IDE警告几乎没有任何意义。

答案 2 :(得分:1)

你的演员语法很好。

您应该检查analysisDataList是否不是null,这表示投射成功。这就是您的IDE告诉您的内容。

如果您在多个地方使用它,请将其编码在单独的功能中。