2012-04-03 13 views
10

Tengo dos preguntas, convenientemente indicado ... En primer lugar, ¿Por qué no puede hago esto:Lista <Object> y lista <?>

List<Object> object = new List<Object>(); 

Y en segundo lugar, tengo un método que devuelve un List<?>, ¿cómo iba a convertir que en un List<Object>, ¿podría simplemente lanzarlo?

¡Gracias!

+0

bien, si ustedes dicen que '' Lista no se puede instanciar, entonces ¿cómo es que el método puede devolver? – Chris

+0

Vale la pena señalar que 'Arrays.asList (T ... a)' devuelve una 'Lista '. Puede inicializar 'List' con' List li = Arrays.asList (1, 2, "3"); 'para guardar algunos tipeos, aunque la' Lista' devuelta será de tamaño fijo y respaldada por la matriz: https: //docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T ... –

Respuesta

28

Por qué no puedo hacer esto:

List<Object> object = new List<Object>(); 

usted no puede hacer esto porque List es una interfaz y las interfaces no se pueden crear instancias. Solo las clases (concretas) pueden ser. Los ejemplos de clases concretas de aplicación List incluyen ArrayList, etc. LinkedList

Aquí es cómo se podría crear una instancia de ArrayList:

List<Object> object = new ArrayList<Object>(); 

he un método que devuelve un List<?>, ¿cómo iba a convertir esa en un List<Object>

Muéstrenos el código correspondiente y actualizaré la respuesta.

+0

El método que devuelve una 'Lista ' proviene de una biblioteca externa y no puedo acceder a el código. Sólo sé que solía devolver una 'Lista ', y luego actualizaron el código y ahora devuelve una 'Lista ', esencialmente rompiendo toda mi codificación. – Chris

+0

La respuesta no aborda adecuadamente la segunda parte de la pregunta. ¿Qué tal un ejemplo? –

4
List<Object> object = new List<Object>(); 

No se puede hacer esto porque Lista es una interfaz y no se puede crear el objeto de cualquier interfaz o en otras palabras que no se puede crear una instancia de cualquier interfaz. Además, puede asignar cualquier objeto de clase que implemente List a su variable de referencia. Por ejemplo, usted puede hacer esto:

list<Object> object = new ArrayList<Object>(); 

Aquí ArrayList es una clase que implementa Lista, se puede utilizar cualquier clase que implementa Lista.

2

La lista es una interfaz por lo que no puede instanciarla. Use cualquiera de sus implementaciones, por ejemplo,

List<Object> object = new List<Object>(); 

Acerca de lista: puede utilizar cualquier objeto como un parámetro genérico para ello ejemplo:

List<?> list = new ArrayList<String>(); 

o

List<?> list = new ArrayList<Integer>(); 

Durante el uso de List<Object> esta declaración no es válida, ya que será tipo missmatch.

0

para responder a su segunda pregunta, sí, se puede emitir el List<?> como List<Object> o una List<T> de cualquier tipo, ya que el parámetro ? (Comodín) indica que la lista contiene una colección homogénea de un cualquierObject. Sin embargo, no hay forma de saber en compilación qué es el type, ya que solo forma parte de la API exportada, lo que significa que no puede ver lo que se está insertando en el List<?>.

Así es como usted haría el reparto:

List<?> wildcardList = methodThatReturnsWildcardList(); 
// generates Unchecked cast compiler warning 
List<Object> objectReference = (List<Object>)wildcardList; 

En este caso se puede ignorar la advertencia porque para que un objeto para ser usado en una clase genérica que debe ser un subtipo de Object. Vamos a pretender que estamos tratando de lanzar esto como List<Integer> cuando en realidad contiene una colección de String s.

// this code will compile safely 
List<?> wildcardList = methodThatReturnsWildcardList(); 
List<Integer> integerReference = (List<Integer>)wildcardList; 

// this line will throw an invalid cast exception for any type other than Integer 
Integer myInteger = integerRefence.get(0); 

Recuerde: los tipos genéricos se eliminan en tiempo de ejecución. No sabrá qué contiene la colección, pero puede obtener un elemento y llamar al .getClass() para determinar su tipo.

Class objectClass = wildcardList.get(0).getClass(); 
Cuestiones relacionadas