resueltos polimorfismo las interfaz interfaces herencia ejercicios ejemplos colecciones caracteristicas java interface casting glazedlists

java - polimorfismo - ¿Cómo convertir la lista de objetos a la lista de interfaces?



interfaces en java ejemplos (4)

Debería funcionar si solo cambias la declaración de cats :

List<? extends Orderable> cats = new BasicEventList<? extends Orderable>(); for (int i=0; i<10; i++) { cats.add(new Cat("Maroo"+i, i)); } Worker worker = new Worker(); worker.setList(cats);

Ver:

Tengo una clase que funciona con interfaces:

Aquí está la interfaz:

public interface Orderable { int getOrder() void setOrder() }

Aquí está la clase trabajadora:

public class Worker { private List<Orderable> workingList; public void setList(List<Orderable> value) {this.workingList=value;} public void changePlaces(Orderable o1,Orderable o2) { // implementation that make o1.order=o2.order and vice versa } }

Aquí hay un objeto que implementa la interfaz:

public class Cat implements Orderable { private int order; public int getOrder() { return this.order; } public void setOrder(int value) { this.order=value; } public Cat(String name,int order) { this.name=name; this.order=order; } }

En el procedimiento principal, creo una lista de gatos. Utilizo listas transparentes para actualizar dinámicamente los controles cuando se cambia la lista y cuando se crea un modelo de control con esta lista.

El objetivo es transferir esta lista a un objeto trabajador, de modo que pueda agregar un nuevo gato a la lista en el procedimiento principal, y el trabajador lo sabrá sin establecer de nuevo la propiedad de la lista (la lista es el mismo objeto en el proceso principal y en obrero). Pero cuando llamo worker.setList(cats) , alerta sobre esperar un Orderable, pero obteniendo un Cat ... pero Cat implementa Orderable. ¿Cómo puedo solucionar esto?

Aquí está el código principal:

void main() { EventList<Cat> cats=new BasicEventList<Cat>(); for (int i=0;i<10;i++) { Cat cat=new Cat("Maroo"+i,i); cats.add(cat); } Worker worker=new Worker(); worker.setList(cats); // wrong! // and other very useful code }


Necesita cambiar la clase Worker para que acepte List<? extends Orderable> List<? extends Orderable>

public class Worker { private List<? extends Orderable> workingList; public void setList(List<? extends Orderable> value) {this.workingList=value;} public void changePlaces(Orderable o1,Orderable o2) { // implementation that make o1.order=o2.order and vice verca } }


Si realmente desea una nueva colección del tipo de interfaz. Cuando, por ejemplo, no posee los métodos que está llamando.

//worker.setList(cats); worker.setList( new ArrayList<Orderable>(cats)); //create new collection of interface type based on the elements of the old one


void main() { EventList<Orderable> cats = new BasicEventList<Orderable>(); for (int i=0;i<10;i++) { Cat cat=new Cat("Maroo"+i,i); cats.add(cat); } Worker worker=new Worker(); worker.setList(cats); // should be fine now! // and other very usefull code }

Sobre todo, solo construye una lista de Orderables de inmediato, ya que el gato implementa Orderable, deberías poder agregar un gato a la lista.

nota: este soy yo, adivinando rápidamente