2011-08-15 25 views
11

Tengo la siguiente clase que almacena una lista de matrices de objetos.¿Por qué Java no llama al método (List <Object>), si tengo un (objeto ...) uno?

public class Test { 
    private List<Object[]> list = new ArrayList<Object[]>(); 

    public void addList(Object... obj) { 
     list.add(obj); 
    } 

    public void addList(List<Object> lst) { 
     list.add(lst.toArray()); 
    } 
} 

Cuando llamo a continuación, el método sobrecargado addList(Object... obj) se llama pero quiero que el addList(List<Object> lst) a ser llamados. ¿Cómo puedo hacer esto?

public class Main { 
    public static void main(String[] args) { 
     Test testObj = new Test(); 
     List<String> myStrings = new ArrayList<String>(); 
     myStrings.add("string 1"); 
     myStrings.add("string 2"); 
     myStrings.add("string 3"); 

     // The variable argument method is called but this is a list! 
     testObj.addList(myStrings); 

    }  
} 
+0

Debería considerar alejarse de un sistema de almacenamiento 'List '. Sean cuales sean tus datos, modelarlos en clases y trabajar con ellos será mucho más fácil que intentar razonar sobre un montón de 'Objetos'. – dlev

Respuesta

8

Cambio List<Object> a List<?> para capturar listas de cualquier tipo de objeto. Intenté esto y lo imprimí "en la lista":

import java.util.ArrayList; 
import java.util.List; 

public class Test { 
    private List<Object[]> list = new ArrayList<Object[]>(); 

    public void addList(Object... obj) { 
     System.out.println("in object"); 
     list.add(obj); 
    } 

    public void addList(List<?> lst) { 
     System.out.println("in List<?>"); 
     list.add(lst.toArray()); 
    } 

    public static void main(String[] args) { 
     Test testObj = new Test(); 
     List<String> myStrings = new ArrayList<String>(); 
     myStrings.add("string 1"); 
     myStrings.add("string 2"); 
     myStrings.add("string 3"); 

     // The variable argument method is called but this is a list! 
     testObj.addList(myStrings); 

    } 
} 
6

List<String> no es una subclase de List<Object>. Para que nunca se llame a la sobrecarga, incluso si elimina la variante ....

7

reescribir el tipo de método no le variadic utilizar un comodín:

public void addList(List<?> lst) { 
    list.add(lst.toArray()); 
} 

Entonces List<String> habrá un subtipo del tipo de parámetro.

2

cambiar su método de

public void addList(List<?> lst) { 
    list.add(lst.toArray()); 
} 
Cuestiones relacionadas