Java For Each语句中的Cast元素

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的界面正确,并让它合同返回你想要的东西.

  • 虽然这个“回复”是一个非常有用的评论,但它根本没有回答问题。虽然该示例显示“我的 DAO 做得很差”,但问题要求提供 for-each 元素转换的解决方案。这个答案根本没有涵盖它。例如,我喜欢将 javax.management.AttributeList 条目类型转换为实际的 Attribute,因为它出于某种奇怪的原因扩展了 ArrayList&lt;Object&gt; 。 (4认同)
  • @Carl - 是否值得包装DAO,并提供*不同的*界面,做你想要的.否则你将不得不在整个代码库中进行转换(可能 - 我意识到我正在假设这是多么广泛的分布) (3认同)

ape*_*ins 15

出于其他人所说的所有理由,你不应该这样做.但是,如果您无法更改界面,则可以执行以下操作:

for (BaseType element : list) {
    SubType subType = (SubType)element;
    ...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是实现这一目标的唯一方法,并保持真正的类型安全 - 即不依赖类型擦除来捕获任何问题,直到很久以后它才会发生.

我意识到这并不是你想要的,但它确实处理了铸造.

  • 为了非常安全,你可以这样做:if(element instanceof SubType) (2认同)

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)