Hola, a ver quien me puede echar una mano.
Estoy con este ejercicio:
Amplía el código del programa Java que planteamos como ejercicio en la entrega CU00687 de este curso, relativo a la gestión de una empresa agroalimentaria, teniendo en cuenta que la empresa gestiona envíos a través de diferentes medios, y un envío puede contener cierto número de productos frescos, refrigerados o congelados. Añade al código:
a) Una clase EnvioDeProductos que represente un envío de productos como colección de objetos que admite el polimorfismo.
b) Crear una clase testHerencia4 con el método main donde se creen: dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados por agua, otros 2 por agua y 1 por nitrógeno). Crear un envío que represente la agrupación de los anteriores productos. Mostrar por pantalla la información del número de productos que componen el envío y recorrer los productos del envío usando iterator para mostrar la información (valor de los atributos) de cada uno de ellos.
Bien, esta de abajo es mi clase EnvioDeProductos. Se deja compilar y funciona correctamente.
El último método, listarEnvio(), lo escribí y lo dejé escrito ya sabiendo que no iba a servir para lo que propone el ejercicio, ya que lo único que hace es mostrar los nombres de los objetos incorporados en el ArrayList, pero no sus atributos.
Aquí el método iterator() si funciona. (luego veréis porque hago este apunte)
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Clase para definir envios de productos mediante una colección polimórfica.
*
* @author Kabuto
* @version 1.0
*/
public class EnvioDeProductos{
private List<Producto> envioProductos;
public EnvioDeProductos(){
envioProductos = new ArrayList<Producto>();
}
//Método para obtener un determinado producto pasando un indice como parámetro
public Producto getEnvioDeProductos(int i){return envioProductos.get(i);}
//Método para modificar un produto de la lista indicando el producto y un indice
public void setEnvioDeProductos(Producto nombreProducto, int i){envioProductos.add(i, nombreProducto);}
//Método para añadir nuevos productos a la lista
public void addEnvioDeProductos(Producto nombreProducto){envioProductos.add(nombreProducto);}
//Para consultar cuantos objetos componen la lista
public int longitudLista(){return envioProductos.size();}
/*Método para listar los productos del envío.
*Tan solo muestra el nombre de cada objeto, no sus atributos
*/
public void listarEnvio(){
Iterator<Producto> it = envioProductos.iterator();
Producto producTmp;
while (it.hasNext()) {
producTmp = it.next();
System.out.println(producTmp);
}
}
}
Bien, ahora viene el main donde creo los distintos productos y los meto juntitos en el ArrayList de EnvioDeProducto.
Todo este proceso furula correctamente.
Al final pretendo hacer lo que propone el ejercicio: Recorrer los productos con un iterador y mostrar toda la información de cada producto.
Pero aquí es donde me da un error al compilar. Me dice que no puedo aplicarle el método iterator() a nuevoEnvio, que es el objeto de la clase GestionDeEnvios, vamos un ArrayList.
¿Por qué aquí no me permite aplicárselo y sin embargo si puedo hacerlo en el código que define la clase?
Os adjunto un zip con todas las clases que componen el proyecto
import java.util.Calendar;
import java.util.Iterator;
/**
* Programa para testear la creacion de productos con herencias
* dos productos frescos, tres productos refrigerados y cinco productos congelados (2 de ellos congelados
* por aire, otros 2 por agua y 1 por nitrógeno). Crear un envio y mostrar datos.
*
* @author Kabuto
* @version 1.0
*/
public class TestEnvioProducto {
public static void main (String[] args){
Calendar fechaCaducidad = Calendar.getInstance();
Calendar fechaEnvasado = Calendar.getInstance();
fechaCaducidad.set(2015,11,25);
fechaEnvasado.set(2015,5,25);//Por comodidad pasaremos las mismas fechas a todos los contructores.
//Creamos varios productos
Fresco fresco1 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 224);
Fresco fresco2 = new Fresco(fechaCaducidad, fechaEnvasado, "España", 227);
Refrigerado refri1 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Alemania", 124);
refri1.setCodigoSuperVision(123); refri1.setTemperaturaConservacion(20);
Refrigerado refri2 = new Refrigerado(fechaCaducidad, fechaEnvasado, "Brasil", 132);
refri2.setCodigoSuperVision(120); refri2.setTemperaturaConservacion(18);
Refrigerado refri3 = new Refrigerado(fechaCaducidad, fechaEnvasado, "China", 114);
refri3.setCodigoSuperVision(113); refri1.setTemperaturaConservacion(21);
Aire congeladoAire1 = new Aire(fechaCaducidad, fechaEnvasado, "EEUU", 285);
congeladoAire1.setComposicionAire(25, 25, 25, 25);
Aire congeladoAire2 = new Aire(fechaCaducidad, fechaEnvasado, "Perú", 034);
congeladoAire1.setComposicionAire(20, 10, 30, 40);
Agua congeladoAgua1 = new Agua (fechaCaducidad, fechaEnvasado, "España", 112);
congeladoAgua1.setSalinidad(12);
Agua congeladoAgua2 = new Agua (fechaCaducidad, fechaEnvasado, "Japón", 123);
congeladoAgua2.setSalinidad(18);
Nitrogeno congeladoNitrogeno = new Nitrogeno(fechaCaducidad, fechaEnvasado, "Rusia", 155);
congeladoNitrogeno.setMetodoCongelacion("Soplando muy fuerte");
congeladoNitrogeno.setTiempoExposicion(500);
//Creamos un envio con todos estosproductos
EnvioDeProductos nuevoEnvio = new EnvioDeProductos();
nuevoEnvio.addEnvioDeProductos(fresco1); nuevoEnvio.addEnvioDeProductos(fresco2);
nuevoEnvio.addEnvioDeProductos(refri1);nuevoEnvio.addEnvioDeProductos(refri2);nuevoEnvio.addEnvioDeProductos(refri3);
nuevoEnvio.addEnvioDeProductos(congeladoAire1);nuevoEnvio.addEnvioDeProductos(congeladoAire2);
nuevoEnvio.addEnvioDeProductos(congeladoAgua1);nuevoEnvio.addEnvioDeProductos(congeladoAgua2);
nuevoEnvio.addEnvioDeProductos(congeladoNitrogeno);
//Mostramos el número de productos en el envío
System.out.println("El envío está compuesto por " + nuevoEnvio.longitudLista() + " productos.");
System.out.println("Listado de productos actuales");
System.out.println("-----------------------------");
System.out.println("");
//Mostramos los datos de los productos a enviar
Iterator<Producto> it = nuevoEnvio.iterator();//Iterator da error "cannot find symbol method .iterator()
Producto producTmp;
while (it.hasNext()) {
producTmp = it.next();
producTmp.mostrarDatos();
}
}
}