2012-06-15 13 views
10

Me preguntaba si es posible lanzar objetos directamente dentro de un bucle foreach.Fundición directa en el bucle foreach

tenemos las dos clases siguientes se extiende uno al otro:

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

Ahora tenemos una gran variedad de libros que quiero recorrer, porque es una búsqueda ExtendedBook estoy seguro de que todos los libros son en realidad, libros extendidos. ¿Hay alguna manera de lanzarlos directamente?

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

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

Esto implica dos pasos. Primero recorriendo los libros y en el segundo paso lanzándolos. ¿Puede uno hacerlo en un solo paso?

Lo que no funciona:

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

Sé que no es un verdadero dolor, pero manteniendo el bucle más corto sería bueno y tal vez sea más legible que se guarda una variable ficticia, que solo se utiliza para la fundición en lugar de la acción real.

+2

Parece que 'books' es una matriz de Book not ExtendedBook. Los elementos de la matriz pueden ser ExtendedBook, pero solo puede cambiar esto para cada elemento. Por cierto, puedes deshacerte de un bucle 'Long [] array = ... for (long l: array) {} ' –

Respuesta

1

Estoy razonablemente seguro de que no puede realizar el ciclo como lo desea.

0

No se puede porque Java no es compatible con la sobrecarga de conversión implícita como en C# con el implicit operator.

1

Piense obout fundición

ExtendedBook ex=(ExtendedBook)new Book(); 

Es aceptado por compilador, pero JVM lanza java.lang.ClassCastException, porque ese tipo de colada está mal ->Book no es ExtendedBook, por lo que hay una posibilidad de que no lo puedo manejar los posibles nuevos métodos agregado en la clase ExtendedBook.

Por la misma razón no se puede hacer algo como

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

pero puede

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

¿Cómo sobre el uso de los genéricos?

Escribe tu firma getBooks como:

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

Ahora, si quieres buscar libros del tipo ExtendedBook, a llamarlo:

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

Sin encasillamiento u otro material peligroso sea necesario. Bonito y limpio.

Por supuesto, usted todavía tiene que asegurarse de que solo ExtendedBook solo devuelva ese tipo de libro, pero parece que ya lo solucionó.

+0

Actualmente estoy trabajando con servicios web y tengo un cliente generado que devuelve los arrays. –

+0

Bien. En ese caso, no creo que haya mucho que puedas hacer al respecto ... –

Cuestiones relacionadas