Java中for-each循环内如何将父类technikModel强转为子类boxenModel
Java集合遍历强转问题解答
不能直接在for-each循环的变量声明处执行强转,你写的示例代码会直接报编译错误:getBox().keySet()返回的是Set<technikModel>类型,泛型校验会判定boxenModel和technikModel类型不匹配,不允许直接赋值。
两种可选用法如下:
方案1:确认所有key都是boxenModel实例时,先对集合整体强转再遍历
如果你能100%保证这个HashMap里存储的所有key都是boxenModel的实例,可以先把Set整体做类型转换再遍历,写法如下:
// 加注解消除 unchecked cast 警告 @SuppressWarnings("unchecked") Set<boxenModel> boxenKeySet = (Set<boxenModel>)(Set<?>) getBox().keySet(); for(boxenModel t : boxenKeySet) { // 直接使用t执行操作 }
注意:该写法没有运行时类型检查,如果Map里存在不是
boxenModel的key,后续使用变量t时会抛出ClassCastException。
方案2:无法保证所有key类型时,循环体内先检查再强转
如果不能确认所有key都是boxenModel类型,推荐在循环体内先做类型判断再强转,安全性更高:
for(technikModel t : getBox().keySet()) { if (t instanceof boxenModel) { boxenModel bm = (boxenModel) t; // 对bm执行操作 } }
该写法会自动过滤掉不是boxenModel类型的key,不会出现类型转换异常。
内容的提问来源于stack exchange,提问作者Ben Bartel
相关产品推荐
相关产品推荐

