我想将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
。
答案 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告诉您的内容。
如果您在多个地方使用它,请将其编码在单独的功能中。