2012-06-15 15 views
10

Mi chiedevo se fosse possibile gettare direttamente oggetti all'interno di un ciclo foreach.Fusione diretta nel ciclo foreach

abbiamo le seguenti due classi sono state uno si estende l'altro:

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

Ora abbiamo una serie di libri che voglio scorrere, perché la sua una ricerca ExtendedBook sono sicuro che tutti i libri sono in realtà libri estesi. C'è un modo per scriverli direttamente?

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

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

Questo prevede due passaggi. In primo luogo scorrere i libri e al secondo passo gettarli. Si può fare in un solo passaggio?

Che cosa non funziona:

// 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){} 

So che la sua non è un vero e proprio dolore, ma mantenendo il ciclo più breve sarebbe bello e forse più leggibile come si salva una variabile dummy, che è appena usato per la fusione invece dell'azione reale.

+2

Sembra che 'books' sia un array di Book non ExtendedBook. Gli elementi dell'array potrebbero essere ExtendedBook, ma puoi cambiarlo solo per ciascun elemento. btw puoi unbox in un ciclo 'Long [] array = ... for (long l: array) {}' –

risposta

1

Sono ragionevolmente sicuro che non è possibile eseguire il ciclo come si desidera.

0

Non è possibile perché java non supporta l'overloading implicito delle conversioni come in C# con implicit operator.

1

Pensate obout colata

ExtendedBook ex=(ExtendedBook)new Book(); 

Si è accettato da compilator ma JVM getta java.lang.ClassCastException, perché quel tipo di casting è sbagliato ->Book non è ExtendedBook, per cui v'è una possibilità che non ci vorrà gestire potenziali nuovi metodi aggiunto nella classe ExtendedBook.

Per lo stesso motivo non si può fare qualcosa di simile

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

ma può

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

Come sull'utilizzo Generics?

Scrivi la firma getBooks come:

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

Ora, se si vuole cercare i libri del tipo ExtendedBook, basta chiamare:

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

Nessun fusione di caratteri o altre cose non sicuri necessario. Bello e pulito.

Naturalmente è ancora necessario assicurarsi che solo ExtendedBook restituisca solo quel tipo di libro, ma sembra che l'abbia già risolto.

+0

Attualmente sto lavorando con i servizi web e ho un client generato che restituisce gli array. –

+0

Ok. In tal caso, non penso che ci sia molto che puoi fare al riguardo ... –