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:
- ¿Por qué un método no puede tomar un Collection <subClass> cuando la firma del método se define como Collection <class>?
- ¿Puedo agregar a una colección genérica de valores tipo A de tipo B, que se extiende A, sin ninguna sintaxis especial?
- Colecciones de Java: pasar colección de niños como colección de padres
- ¿Cómo lanzar una lista de objetos heredados a una colección de objetos en Java?
- y muchos otros...
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