2010-12-06 19 views
5

sé que con el fin de crear un objeto de tipo ArrayList necesito:ArrayList (Colección <? extends E> c)

ArrayList<MyType> l = new ArrayList<MyType>(); 

lo sé porque lo he visto en los libros.

Pero al mirar a la API de Java SE para el constructor ArrayList veo: ArrayList(Collection<? extends E> c)

No entiendo, ¿cómo podría jamás tener una idea para especificar el tipo de objetos que obstaculicen mi nuevo objeto ArrayList? ¿Cómo sabría por esta definición que tengo que especificar <MyType> durante la creación de instancias y la declaración de variables?

+1

Dónde ¿Está buscando porque veo: "ArrayList pública (Colección c)" – jzd

+0

@jzd, eso es lo que el PO ya se puso en esta pregunta .... –

+0

usar por cierto Lista l = new ArrayList (); no está mal cuando usas la clase de implementación, pero es mejor ocultar los detalles de implementación –

Respuesta

3

Para saber si necesita parámetros de tipo en su declaración, no mira al constructor, mira el class definition itself. Los argumentos de los constructores no tienen nada que ver con el tipo del objeto en sí; un constructor puede tomar cualquier tipo de argumento, como cualquier otro método. Aquí está la definición de clase:

public class ArrayList<E> 
extends AbstractList<E> 
implements List<E>, RandomAccess, Cloneable, Serializable 

La parte class ArrayList<E> dice que hay una clase llamada ArrayList y requiere un parámetro de tipo (que se llama E aquí).

+0

Muchas gracias, ahora lo tengo. – Eugene

4

Este método está destinado a copiar una instancia de colección existente a la nueva ArrayList para no crear desde cero. Los elementos de la colección que aceptará tienen un límite superior de tipo E que será el tipo de su nueva ArrayList.

1

Eso es siempre cierto cuando se construye un objeto para una clase que toma un tipo genérico. Si se desplaza hacia arriba, verá Class ArrayList < E>. Esa es la pista.

2

Digamos que tiene un conjunto de clases de formas. La clase base es Shape, y las dos implementaciones son Square y Circle. Ahora, después de haber hecho una configuración específica para la lista de objetos que deseaba, debe agregarla para enviarla a una función de renderizado. a continuación el código debe hacer lo que estoy describiendo un poco más claro:

ArrayList<Square> squares = readSquares(); 
ArrayList<Circle> circles = readCircles(); 

ArrayList<Shape> queue= new ArrayList<Shape>(squares); 
queue.addAll(circles); 

renderShapes(queue); 

El constructor hace ArrayList(Collection<? extends E> c) línea de cinco posibles. Con los genéricos, el procesador no es lo suficientemente inteligente como para determinar automáticamente que Square extiende la forma de forma predeterminada. Tienes que decirle al compilador que es lo que pretendías. La forma de hacerlo es con el comodín <? extends E>. Ahora el compilador se asegurará de que cada objeto agregado sea al menos una Forma.

Cuestiones relacionadas