2012-06-15 31 views
10

我想知道是否可以在foreach循环中直接投射对象。在foreach循环中直接投射

我们有以下两个类是一个扩展其他:

class Book {}; 
class ExtendedBook extends Book {}; 

现在我们有,我想通过循环书籍的数组,因为它的一个ExtendedBook搜索我敢肯定,所有的书都实际上扩展书籍。有没有办法直接施放它们?

Book [] books = bookSearch.getBooks("extendedBooks"); 

for (Book book: books){ 
    ExtendedBook eBook = (ExtendedBook) book; 
    .... 
} 

这涉及两个步骤。首先循环阅读书籍,然后在第二步中投射。一个人能做到吗?

什么不起作用:

// Directly assign it to a different type 
for (ExtendedBook book : books){} 

// Directly casting the array 
ExtendedBooks [] eBooks = (ExtendedBooks []) books; 

// Same goes for trying both in one step 
for (ExtendedBook book : (ExtendedBook []) books){} 

我知道它不是一个真正的痛苦,但你保存一个虚拟变量,它只是用于铸造保持回路短将是很好,也许更具有可读性而不是实际的行动。

+2

看起来'books'是一本Book not ExtendedBook的数组。数组的元素可能是ExtendedBook,但您只能为每个元素更改此元素。顺便说一句,你可以在一个循环中取消装箱Long [] array = ... for(long l:array){} –

回答

1

我相当肯定你不能按照你的意愿投入循环。

1

想想obout铸造

ExtendedBook ex=(ExtendedBook)new Book(); 

它是由compilator接受,但JVM抛出java.lang.ClassCastException,因为该类型转换是错误的 - >BookExtendedBook,所以有机会的话,它不会处理潜在的新方法增加在ExtendedBook类。

因为你不能这样做

ExtendedBook[] exbooksB=(ExtendedBook[]) new Book[10]; 

但可以

Book[] booksA=new ExtendedBook[10]; 
ExtendedBook[] exbooks=(ExtendedBook[]) booksA; 
2

如何使用泛型同样的原因是什么?

撰写您getBooks签名:

<B extends Book> B [] getBooks(Class<B> bookType) 

现在,如果你要搜索的类型ExtendedBook的书籍,只要致电:

ExtendedBooks [] eBooks = bookSearch.getBooks(ExtendedBook.class) 

没有强制类型转换或需要其他不安全的东西。很好,很干净。

当然,你仍然必须确保只有ExtendedBook只返回那种书,但它看起来像你已经解决了。

+0

其实我正在使用Web服务,并有一个生成的客户端返回数组。 –

+0

好的。在这种情况下,我不认为你可以对此做很多... –