2010-10-14 10 views
16

Por ejemplo, en lugar de hacerCuando crea una ArrayList sin especificar el tipo de objeto, ¿la crea automáticamente cuando agrega el primer objeto?

ArrayList<ClassName> variableName; 

haces

ArrayList variableName; 

luego se agrega un objeto de tipo "nombre de clase"

variableName.add(objectName); 

habrá que ajustar automáticamente el tipo de su matriz como

ArrayList<ClassName> 

?

+2

¿Qué sucede si lo intentas? –

+0

Ver http://download.oracle.com/javase/tutorial/java/generics/generics.html y http://download.oracle.com/javase/tutorial/java/generics/erasure.html – helpermethod

Respuesta

34

No. Los genéricos son solo para tiempo de compilación. Estás perdiendo el beneficio de ese cheque. En tiempo de ejecución toda la información genérica se borra

En otras palabras,

ArrayList<Type> 

en tiempo de ejecución es sólo un ArrayList. El beneficio de hacerlo en una Lista es que cuando escribe el código, el compilador verificará que no coloque nada inapropiado en su lista.

9

cuando no especifica, sería lo mismo que si hubiera especificado ArrayList <Objeto>, lo que significa que cualquier tipo de objeto podría agregarse a ArrayList. Las comprobaciones de tipo que se realizan al especificar una clase suceden en tiempo de compilación, no en tiempo de ejecución, por lo que no es posible que las cosas funcionen de la forma que usted propone (teniendo más clases específicas determinadas en tiempo de ejecución).

+1

Yo diría que semánticamente ArrayList significa que "esta lista contiene objetos potencialmente de cualquier tipo", mientras que ArrayList significa "este es un código heredado o no me molesté en especificar el tipo de elementos de esta lista para el compilador". – ninjalj

+0

ninjalj: Entonces, ¿cómo llamarías a ArrayList ? Yo diría que "esta lista contiene objetos potencialmente de cualquier tipo", mientras que un ArrayList sería "esto contiene objetos". – bwawok

7

El tipo real es realmente ArrayList. El tipo ArrayList<ClassName> solo existe para el compilador (esto se llama borrado), y su propósito es proporcionar seguridad de tipo en el nivel del compilador. Pero en el nivel de bytecode no tienes ese conocimiento de tipos genéricos.

Cuestiones relacionadas