Car*_*ers 18 java foreach casting
是否有可能(甚至可取)在语句本身中为每个语句转换检索的元素?我知道列表中的每个元素都是类型<SubType>.
IE:
List<BaseType> list = DAO.getList();
for(<SubType> element : list){
// Cannot convert from element type <BaseType> to <SubType>
...
}
Run Code Online (Sandbox Code Playgroud)
而不是:
List <BaseType> list = DAO.getList();
for(<BaseType> el : list){
<SubType> element = (<SubType>)el;
...
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*new 18
你真的知道每个条目都是一个子类型吗?DAO只需履行List<BaseType>合同,如果你假设一个子类,那么我认为某些地方出了问题.我可能更专注于让DAO的界面正确,并让它合同返回你想要的东西.
ape*_*ins 15
出于其他人所说的所有理由,你不应该这样做.但是,如果您无法更改界面,则可以执行以下操作:
for (BaseType element : list) {
SubType subType = (SubType)element;
...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这是实现这一目标的唯一方法,并保持真正的类型安全 - 即不依赖类型擦除来捕获任何问题,直到很久以后它才会发生.
我意识到这并不是你想要的,但它确实处理了铸造.
Pet*_*raf 11
实际上可以将强制转换与for循环结合起来,如下所示:
List<BaseType> list = DAO.getList();
for (SubType subType : ((List<SubType>) list)){
...
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用这个稍微清洁的模式:
List<SubType> list = (List<SubType>) DAO.getList();
for (SubType subType : list){
...
}
Run Code Online (Sandbox Code Playgroud)
您将从Java编译器获得未经检查的强制转换警告,除非您禁止它.第一种形式的效果实际上与在循环中转换每个元素相同.第二种形式还将强制列表的新添加必须符合SubType.
请注意,这不适用于数组,因为数组具有不同的运行时类型.换句话说,BaseType []不能转换为SubType [].您可以使用Arrays API解决此问题,如下所示:
BaseType[] array = DAO.getArray();
for (SubType subType : Arrays.<SubType>asList(array)) {
...
}
Run Code Online (Sandbox Code Playgroud)