2012-06-15 58 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

好的。在這種情況下,我不認爲你可以對此做很多... –