2011-09-27 13 views
28

tengo alguna clase que trabaja con interfaces:¿Cómo convertir la lista de objetos a la lista de 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í es 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 Uso glazed lists 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 de trabajo, por lo que puedo agregar un nuevo gato a la lista en el procedimiento principal, y el trabajador lo sabrá sin establecer su propiedad de lista nuevamente (la lista es el mismo objeto en proc principal y en trabajador). Pero cuando llamo al worker.setList(cats), alerta sobre la posibilidad de esperar un Orderable, pero obteniendo un Cat ... pero Cat implementa Orderable. ¿Cómo puedo solucionar esto?

Este es 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 
} 

Respuesta

32

es necesario cambiar la clase Worker para que acepte 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 
    } 
} 
+0

Este enfoque funcionó mejor para mí ya que solo tengo que cambiar la firma del método "Trabajador", no la declaración de una matriz, que no quería tocar en _todos mis archivos. OMI un enfoque más factible que la respuesta sugerida de Matt Ball – Makibo

7

Debería funcionar si sólo cambia 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:

1
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 
} 

En su mayoría, simplemente construir una lista de Orderables inmediato , ya que el gato implementa Ents Orderable, deberías poder agregar un gato a la lista.

nota: este soy yo rápidamente adivinar

4

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 
Cuestiones relacionadas