Está en la página 1de 12

Ficha de Estudio: Listas Genéricas - Listas Homogéneas – Clases de Envoltorio

Listas Genéricas - Listas Homogéneas - Clases de Envoltorio
Abstract: Implementación de listas simples de contenido polimórfico (listas genéricas). Operaciones básicas
de inserción, eliminación, recorrido y búsqueda. Listas genéricas ordenadas: nodos de contenido Comparable. Listas homogéneas y heterogéneas. Control de homogeneidad en una lista mediante código del programador en tiempo de ejecución. Clases de Envoltorio (Wrapper Classes) de Java para los tipos primitivos. Auto boxing.

1.) Caso de análisis: Desarrollo de una clase para manejar Listas Simples Genéricas. Una lista simplemente vinculada (o lista simple) es una estructura lineal compuesta por una serie de elementos individuales llamados nodos. Cada nodo es un objeto formado, mínimamente, por dos campos: uno de ellos (que llamaremos info) contiene el valor o elemento de información que se almacena en el nodo; el otro (que llamaremos next) es un puntero con la dirección del nodo sucesor. El campo next del último nodo, normalmente vale null, indicando que el nodo no tiene sucesor. La dirección del primer nodo de la lista se almacena en una referencia separada, a la que podemos llamar frente. El gráfico siguiente muestra una lista simple en la que cada nodo almacena números enteros:
info
3

next
2 7

frente

Básicamente, la implementación de una Lista como la de la figura puede hacerse en base a dos clases sencillas: una para representar a los nodos y la otra para representar a la lista en sí misma, como conjunto de varios nodos ligados. En esta primera versión, el info de cada nodo será un simple atributo de tipo int:
public class Node { private int info; private Node next; public Node (int x, Node n) { info = x; next = n; } // resto de los métodos aquí… } public class SimpleList { private Node frente; public Lista () { frente = null; }

Ing. Valerio Frittelli

-

1

Lo siguiente sería correcto: public class Principal { public static void main( String args [ ]) { SimpleList a = new SimpleList(). a. a. } // resto de los métodos aquí… } Esta versión preliminar sencilla de la clase SimpleList incluye algún método para agregar un nodo en la lista.. Entonces definimos: una lista cuyos nodos son capaces de aceptar objetos de cualquier clase. podemos pensar en dos tipos de listas genéricas. se presentarán problemas de compilación: SimpleList b = new SimpleList().Ficha de Estudio: Listas Genéricas . y usar nodos de esa clase en una única clase SimpleList.addFirst( "casa" ). si admite que esa misma instancia de la lista pueda almacenar objetos de clases diferentes. pero cambiando el tipo del info en el nodo y el tipo del parámetro en el método addFirst(). si se quiere una lista de cadenas de caracteres deberíamos declarar otra clase Node y otra clase SimpleList iguales a las originales.addFirst( 3 ). al principio de la lista. se denomina lista polimórfica o también. sin tener que declarar nuevamente la clase de la lista. b. Está claro que esta solución no es práctica.. aparece el método addFirst() que añade un nodo con info igual a x (siendo x un parámetro). // no compila… El problema es que tanto la clase Node como la clase SimpleList están declaradas de forma que el info de cada nodo se supone int y sólo int.) Listas Genéricas Heterogéneas: una lista genérica se dice heterogénea. un método como addFirst() debería recibir un parámetro polimórfico e insertar eso en la lista. En principio. En el ejemplo. … } } Sin embargo. según las restricciones que el programador decida imponer a los datos que almacene en ellas: a. lista genérica. se pretenderá crear instancias de la clase SimpleList y comenzar a usarlas para almacenar valores. frente = p. si ahora se quiere crear una nueva instancia de la clase SimpleList para guardar en ella cadenas de caracteres (o valores de cualquier tipo o clase que no sea int). Si el método addFirst() de la clase SimpleList permitiese la inserción de objetos de clases diferentes. frente). Luego de definidas estas dos clases.addFirst( 7 ). el siguiente esquema produciría una lista como la que se muestra debajo: Ing. Y en esa línea de conceptos. En ella.Listas Homogéneas – Clases de Envoltorio public void addFirst (int x) { Nodo p = new Node(x. deberíamos tener tantas clases SimpleList y Node como tipos de datos diferentes querramos almacenar en nuestras listas. Valerio Frittelli 2 - . Lo mejor sería definir una sóla clase Node cuyo info sea polimórfico.

y lo ignoraría si no lo fuera): SimpleList a = new SimpleList(). a. si admite que esa misma instancia de la lista sólo pueda almacenar objetos de una misma y única clase. a.Ficha de Estudio: Listas Genéricas .) Listas Genéricas Homogéneas: una lista genérica se dice homogénea.addFirst( "perro" ) a. a.addFirst( "casa" ).Listas Homogéneas – Clases de Envoltorio SimpleList a = new SimpleList(). el siguiente segmento de código produciría una lista como la que se ve más abajo (note que la última llamada al método para insertar un objeto Integer.addFirst( new Integer(5) ). no produciría cambios en la lista: simplemente el método controlaría si el objeto que se quiere insertar es válido en esa lista.addFirst( "casa" ). una lista homogénea frente "casa" (String) "mesa" (String) "perro" (String) Parece claro que el desarrollo de una clase que represente una lista genérica homogénea es más desafiante: requiere que el programador implemente los métodos de inserción de forma tal que el Ing.addFirst( new Integer(5) ). una lista heterogénea frente "casa" (String) (Inversion) 5 (Integer) b. a. a.addFirst( "mesa" ).addFirst( new Inversion() ). Si el método addFirst() de la clase SimpleList no admite insertar objetos de clases diferentes en la misma lista. a. Valerio Frittelli 3 .

Parece buena idea. } public Node getNext() { return next.NoSuchElementException. } public void setNext(Node p) { next = p. la idea es implementar sus métodos de forma que trabajen con parámetros polimórficos (referencias a Object) Por ejemplo.. public Node ( ) { } public Node (Object x. Nodo p) { info = x. private Nodo next. Una versión preliminar (e incompleta. public SimpleList () Ing.toString(). } } Y en la clase SimpleList. } public Object getInfo() { return info.) de la clase SimpleList podría verse así (ver modelo TSB-SimpleList1): import java.. Y ese será nuestro objetivo: plantear la clase SimpleList para que las listas creadas sean homogéneas (aunque iremos cumpliendo de a poco ese objetivo). } public void setInfo(Object p) { info = p. que info sea una referencia a Object (ver modelo TSBSimpleList1): public class Node { private Object info. Valerio Frittelli - 4 . next = p.util.Ficha de Estudio: Listas Genéricas . sólo es cuestión de redefinir la clase Node para que el atributo info sea tan polimórfico como se pueda. entonces. } public String toString() { return info. En principio. public class SimpleList { private Node frente.Listas Homogéneas – Clases de Envoltorio propio método controle que el objeto que se inserta sea de la misma clase que los que ya están en la lista. el método para insertar un nodo al frente de la lista es sencillo (aún no nos preocuparemos por cuidar la homogeneidad: sólo procuraremos que el nodo simplemente se inserte adelante) y otros métodos de uso básico también son directos.

getNext(). borrar todo el contenido de la lista. res = res + p. la clase SimpleList permite añadir objetos al principio de la lista. frente). frente = frente. Object x = frente.. String res = "[ ".toString(). p = p. } public String toString() { Node p = frente. } } public void clear( ) { frente = null.".Listas Homogéneas – Clases de Envoltorio { frente = null.. Por lo tanto. } } Así planteada. } public void addFirst(Object x) { if ( x != null ) { Node p = new Node(x.. recuperar el primer objeto (con opción a removerlo o no de la lista). frente = p. } public Object removeFirst() { if (frente == null) throw new NoSuchElementException("Error: la lista está vacía."). Todos los métodos planteados son bastante simples y directos. También note que los métodos getFirst() y removeFirst() retornan Ing.Ficha de Estudio: Listas Genéricas . } res = res + " ]". es posible crear una lista con objetos de varias clases diferentes (como la lista b en el método main() que se muestra más abajo).").getNext() != null ) res = res + " . Valerio Frittelli 5 .getNext(). y finalmente retornar una cadena con el contenido de la lista completa. while( p != null ) { if ( p.getInfo(). return x.. Observe que el método addFirst() no verifica que la inserción sea homogénea: simplemente añade el objeto al inicio de la lista y sólo controla que la referencia tomada como parámetro no venga nula. } public Object getFirst() { if (frente == null) throw new NoSuchElementException("Error: la lista está vacía.getInfo(). return frente. return res.

addFirst("casa"). SimpleList b = new SimpleList(). a. para mantener ordenada esa lista). // retorna la primera cadena sin removerla String cad2 = (String) a. En los desarrollos que hemos mostrado en la sección anterior para implementar una lista genérica..out. Si queremos que los objetos almacenados en nuestras listas dispongan polimórficamente del método compareTo() y poder así establecer una relación de orden entre ellos.out. System.. b.println( "\nLista heterogénea: " + b ).toString()).addFirst( new Integer(5) ). SimpleList a = new SimpleList(). Tal método podría ser el método compareTo() tal como lo impone la interface Comparable. System. // remueve y retorna la primera cadena String cad1 = (String) a. System. El problema es que luego de creado un objeto de la clase SimpleList querremos eventualmente lanzar métodos que trabajen con el contenido de cada nodo. . entonces nuestra clase Node.. deberá pertenecer a alguna clase que Ing.addFirst("perro").. todo objeto almacenado en nodos de la lista debería proveer un método que permita compararlo con otro objeto que sea de su misma clase. Entonces.out. System. b. hemos sugerido como primer intento que el info de cada nodo sea una referencia a Object: public class Node { Object info.println("La primera cadena era: " + cad1). } Y en la clase SimpleList hemos incluido métodos para insertar.. 2000) ). Valerio Frittelli 6 .addFirst( new Cuenta (23..removeFirst(). // ahora una lista heterogénea.Ficha de Estudio: Listas Genéricas .out.. primero se debe hacer casting explícito hacia la clase String. deberíamos hacer que el info apunte a objetos de clases que hayan implementado Comparable y no a Object. La siguiente clase incluye un método main() simple para testear este desarrollo (ver modelo TSB-SimpleList1): public class Principal { public static void main(String args[]) { // una lista de cadenas. a.addFirst( "juan" ).toString()).println("Lista de cadenas: " + a. a.println("La primera cadena es ahora: " + cad2).addFirst("sol").println("Lista de cadenas (luego del borrado): " + a.getFirst(). b.out.) Nodos de contenido Comparable y control de homogeneidad. borrar y convertir a String que realmente funcionaban mediante este mecanismo. } } 2. y para poder asignarla en una referencia a un String (o a cualquier otra clase). System. Todo objeto que desee almacenarse en nuestras listas.Listas Homogéneas – Clases de Envoltorio una referencia a un Object. según se vió en una ficha de estudio anterior. por ejemplo para poder comparar sus valores (por caso.

) Si x es null. Sin embargo. ambas usan ese mismo. } En los modelos que siguen.Listas Homogéneas – Clases de Envoltorio haya implementado antes la interface Comparable. y se desarrolla dentro de ella el método compareTo( ). Si x no es null y la lista está vacía. Por otra parte. De este modo. y que cada método de la clase SimpleList ahora opera con esa consigna.) c. Si x no es null y la lista no está vacía.getInfo() ) != 0 ) { p = p. y como a ambas el método definido en Cuenta les sirve. Está claro que sólo es necesario controlar la clase del que se quiere insertar contra la clase del primer objeto que ya esté en la lista (si la lista es homogénea.Ficha de Estudio: Listas Genéricas . Este método verifica si el objeto tomado como parámetro está en la lista y retorna true en ese caso. } return ( p != null ).) b. Valerio Frittelli 7 . La clase Cliente (también provista en el modelo) implementa a su vez Comparable y provee su propia versión del método compareTo( ). se incorporarán nuevos métodos a la clase SimpleList que aprovechen la disponibilidad del método compareTo(). nos proponemos hacer que nuestras listas sean homogéneas: una misma lista sólo podrá contener objetos de la misma clase. Las dos clases pueden ser usadas para definir objetos que luego puedan ser incluidos dentro de una de nuestras listas. implementa la interface Comparable. El método recorre la lista y usa el método compareTo() (aunque también podría usar el método equals() heredado desde Object si ese método fuese adecuadamente redefinido en las clases derivadas) para hacer la comparación entre cada objeto de la lista y el objeto buscado: public boolean contains (Comparable x) { if (x == null) return false. Para esto..) Un análisis más detallado sugiere los siguientes controles (suponemos que x es el parámetro que apunta al objeto que se quiere insertar): a. Node p = frente. todos los que siguen son de la misma clase que el primero.getNext(). (ver modelo TSB-SimpleList3) los métodos de inserción deberían modificarse de forma que controlen que la clase del objeto que se inserta coincida con la clase de los que ya están en la lista. De esta forma. Veamos también que el info de la clase Node se cambió para ser de tipo Comparable. las listas podrán aprovechar la presencia de ese método para implementar otros métodos que puedan comparar objetos (y no sólo agregarlos o borrarlos en una posición fija) En el proyecto TSB-SimpleList2 mostramos que la clase Cuenta (abstracta y base de una jerarquía de clases que modelan cuentas bancarias). De esa clase heredan las clases Corriente e Inversión. inserte el objeto x en la lista sin problemas. inserte x en la lista pero sólo si la clase de x coincide con la clase del primer objeto ya está en la lista..compareTo( p. la forma en que fueron desarrollados los métodos de inserción de la clase SimpleList en los modelos TSB-SimpleList1 y TSB-SimpleList2 hacen que las listas representadas se comporten como listas heterogéneas: se puede insertar objetos de clases diferentes en la misma lista. la nueva versión del método addFirst() puede quedar así: Ing. En el modelo TSB-SimpleList2 se ha agregado un método contains() a la clase SimpleList. Se puede usar el método getClass() heredado desde Object para controlar la clase de x contra la clase del primero de la lista. while ( p != null && x. no hacer nada y salir sin hacer inserción ni tarea alguna. Un ejemplo de aplicación se muestra en el método main() de la clase Principal del modelo TSB-SimpleList2.

out. y así sucesivamente. la suposición de su existencia ayuda a simplificar los procesos de recorrido y manejo de una lista. el nodo con índice 0 en la lista). y true en caso contrario: private boolean isHomogeneus (Comparable x) { if ( x == null ) return false. el primer nodo de la lista es el nodo que está en la posición 0 de la lista (o también. Así. se han incluido en la clase SimpleList un grupo de métodos que por ahora (y hasta que se estudie la forma de implementar iteradores para hacer esta tarea en forma eficiente) podrán facilitar el trabajo de recorrer la lista cuando se esté programando un método de una clase que no sea la propia clase SimpleList (por ejemplo.. remover el elemento del final ( removeLast() ). } El control de homogeneidad debe realizarse en varios de los métodos de la clase. Si bien esos índice realmente no existen en la lista ni están almacenados en ningún atributo de la clase Node.out. insertar suponiendo que la lista está ordenada ( addInOrder() ). return true.getClass() != frente.getInfo(). en todos los métodos de inserción y en general en todos los métodos que tomen como parámetro un objeto para insertarlo. i++ ) Ing.println( "\nLista de Cuentas: " + lis1 ). int b = 0.add( 2. etc.getClass() ) return false. el método compareTo() podría intentar comparar objetos que no sean de la misma clase y provocaría con ello una exception de la clase ClassCastException. El siguiente ejemplo ayuda a ilustrar el uso de los métodos citados: SimpleList lis1 = new SimpleList(). en forma semejante a los componentes de un arreglo.Ficha de Estudio: Listas Genéricas .. Por otra parte. new Inversion (212. i < lis1. que básicamente consideran que los nodos de la lista están numerados con valores de cero en adelante. new Inversion (511. Se trata de los métodos add( i. 2. 3000.2f) ). x ) – remove( i ) – get( i ) – indexOf( x ) y otros similares. 1. buscar y retornar un objeto tal como está en la lista ( search() ). Por lo pronto. Si la lista no fuera homogénea y se lanza una búsqueda de un objeto x en ella. x ) – set( i. inserte tranquilo Node p = new Node(x. for( int i = 0.1f) ). Para evitar repetir las líneas de código que realizan el control.isEmpty() ) System.add( 0. 1000.Listas Homogéneas – Clases de Envoltorio public void addFirst(Comparable x) { if ( x == null ) return. Valerio Frittelli - 8 . lis1. if ( frente != null && x. el segundo nodo tiene posición 1 (o índice 1).size(). lis1.add( 1.println( "\nNo hay cuentas en la lista." ).. el método main()). está todo ok. la clase SimpleList incorpora un método privado isHomogeneus() que retorna false si x es null o no es homogénea con el primer elemento de la lista. } El modelo TSB-SimpleList3 incorpora estos cambios y añade varios otros métodos para insertar al final ( addLast() ). if( lis1. new Inversion (101. // si llegó acá. 3) ). frente). if ( frente != null && x. frente = p..getInfo(). System. para removerlo o para buscarlo en la lista.getClass() != frente. else { float a = 0. lis1. 2000.getClass() ) return.

pero sin removerlo (la cantidad de nodos de la lista no cambia). Las líneas: lis1. 1000. Si se invoca al método get() para obtener el objeto de la posición 1. 1) ). Ing. new Inversion (82. el valor de i debe ser apropiado al rango de posiciones de la lista: si i < 0 || i >= n el método lanzará una excepción de índice fuera de rango. la siguiente instrucción provocará una excepción por índice fuera de rango: lis1.getSaldo(). en la posición cuyo índice es i. 1. pero no puede "saltearse" posiciones.1f) ). Por ejemplo: en la lista lis1 del modelo anterior almacenaron objetos de la clase Inversion.out. se convierte en una referencia a un objeto de una clase específica. para insertar en la lista lis1 tres objetos de la clase Inversion. new Inversion (511. En el modelo. y que debería usarse casting explícito para convertir esta referencia en otra del tipo que se requiera. new Inversion (101. 2000. System. agregan esos tres objetos en las posiciones 0.get( 1 ). i < lis1. Pero si la lista tiene ya cuatro nodos (el último entonces en la posición 3). la forma de hacerlo sería: Inversion x = ( Inversion ) lis1. for( int i = 0.add( 2. 1000.add( 0.size(). Igual que antes. 2. 500.2f) ). Los nodos que ya estaban en la lista a partir de esa posición. 3000.add( 8. new Inversion (212. el método add( i. En otras palabras: si la lista tiene n nodos. El método get( i ) retorna el objeto que se encuentra en la posición i de la lista. b++. 3) ). } El método add( i. Considere que el método retorna una referencia de tipo Comparable.) y obtener el saldo promedio: float a = 0.getSaldo(). x ) inserta el objeto x en la lista. hemos invocado tres veces a ese método. 1 y 2 respectivamente.Listas Homogéneas – Clases de Envoltorio { Inversion x = ( Inversion ) lis1.Ficha de Estudio: Listas Genéricas .add( 1.println( "\nSaldo promedio de las cuentas de Inversion: " + prom ). lis1. } float prom = 0. apuntando al objeto que se encontraba en el info del nodo accedido. if( b != 0 ) prom = a / b.. Dada la lista anterior. la referencia polimórfica que get() retorna.get( i ). lis1. 2) ). i++ ) { Inversion x = ( Inversion ) lis1. De esta forma. Valerio Frittelli - 9 . Note que el método podrá agregar un nuevo nodo al final de la lista. en las posiciones 0.get( i ). a += x. y a partir de ella el programador puede acceder a sus métodos particulares.. este idea se está usando para recorrer la lista con un ciclo for (al estilo del recorrido de un vector. x ) provocará una excepción si i<0 || i >n. a += x. la siguiente instrucción agregará un nodo en la posición 3: lis1. se mueven un lugar hacia la derecha (la posición de cada uno aumenta en 1). new Inversion (12. int b = 0.add( 3. En el modelo. 1 y 2 respectivamente.

Listas Homogéneas – Clases de Envoltorio b++. aunque doblemente vinculada (cada nodo tiene un puntero al siguiente y al anterior) y con dos punteros de acceso: uno al primer nodo de la lista y otro al último. Eso implica que un ciclo for que recorra la lista completa (por ejemplo. x). note que algunos métodos que nuestra clase implementa no están en LinkedList: el método addInOrder() de nuestra clase SimpleList agrega un objeto de forma que la lista se mantenga ordenada si es que ya estaba ordenada previamente. La clase LinkedList está pensada como una colección heterogénea de objetos que brinda métodos para insertar al principio. atrás o en alguna posición intermedia. En general. Los métodos que permiten recorrer la lista "como si fuera un arreglo" (get(i). Pero la implementación de un iterador (por ahora) está fuera de nuestro objetivo. para calcular el saldo promedio como vimos en el ejemplo anterior) será muy ineficiente. esa clase está diseñada con otras convenciones y principios que son los que guiaron el diseño de todo el paquete java. debido a que se trata de un algoritmo interesante y tratado históricamente en materias similares a la nuestra. Se deja para el estudiante el análisis del código fuente de estos métodos. Solo nos limitaremos a decir que el problema puede resolverse correctamente implementando y usando un objeto iterador. pero debe entender el alumno que esa sencillez tiene un precio: todos estos métodos recorren la lista (en el peor caso. para acceder al siguiente nodo. indexOf() retorna –1. x ). y otros que aparecen en la clase.util. el tamaño de la lista). pero nunca teniendo en cuenta los contenidos de los objetos. trataremos de mantenernos "a la par" de las convenciones y clases del paquete java. En esta ficha de estudio no nos preocuparemos por ese hecho y aceptaremos la sencillez que obtenemos a cambio. Por su parte. Note que a diferencia del método add( i. add(i. x). pero cuando las circunstancias nos sugieran incluir elementos que rompan esa paridad. hasta el final…) para llegar al nodo número i que queremos acceder. por el objeto x.util. El método set( i. if( b != 0 ) prom = a / b. Note que la clase SimpleList provee un método size() que retorna la cantidad de nodos que la lista tiene (o sea. y ese valor se usa para controlar el final del ciclo for de recorrido. Volveremos sobre este tema en fichas posteriores. pero lo elimina de la lista (a diferencia de get( i ) que lo retorna sin removerlo).util y que ya viene predefinida en el lenguaje.Ficha de Estudio: Listas Genéricas . el cual permite recorrer la lista sin tener que volver a comenzar el recorrido cada vez que queremos otro nodo. System. Oportunamente estudiaremos las clases del paquete java.println( "\nSaldo promedio de las cuentas de Inversion: " + prom ). set(i. Y el método indexOf( x ) busca el objeto x en la lista. x ) cambia el info del nodo que está en la posición i. } float prom = 0. Java incluye versiones predefinidas de varias clases que representan estructuras de datos básicas y la clase LinkedList representa una lista genérica heterogénea. el método set( i. etc. y en caso de encontrarlo retorna el índice del primer nodo que lo contenga (comenzando desde el frente de la lista). pero es bueno que el alumno tome conciencia del problema. Valerio Frittelli 10 . la denominación de los métodos se ha hecho de forma que sean análogos a los métodos que incluye la clase LinkedList del paquete java.out.) son muy útiles para facilitar el trabajo de recorrido de la lista cuando se programa ese recorrido desde fuera de la clase SimpleList. Si el objeto x no está en la ista. lo Ing. En ese sentido. En nuestra propuesta de SimpleList hemos preferido incluir ese método addInOrder() no convencional. En la medida que sea posible. ya que en cada vuelta de ese ciclo comenzará el recorrido nuevamente. Si bien se ha intentado seguir la clase LinkedList como modelo para el planteo de nuestra clase SimpleList. remove(i). Pero ese método (al igual que nuestro método search() ) no está presente en LinkedList: simplemente. x ) no agrega un nuevo nodo a la lista (el tamaño de la lista no cambia): sólo reemplaza el objeto en la posición i por el objeto x que viene como parámetro.util y su estructura y convenciones de trabajo. el método remove( i ) retorna el objeto que estaba en la posición i.

char c2 = c1.parseInt() o Float. Esas clases se implementan definiendo simplemente un atributo del tipo al que se desea representar. floatValue(). era la única forma de hacerlo hasta la versión 1. incluso los tipos primitivos pueden usarse en jerarquías de clases y entrar en el polimorfismo: veremos que esa capacidad resulta muy útil y necesaria. se puede realizar la conversión del String retornardo a un número mediante los métodos Integer.4 (incluida) del lenguaje. Debido a que ese valor aparece como envuelto en la clase. 3. esas clases se llaman clases de envoltorio (wrapper classes). De esta forma. No es objetivo de esta cátedra replicar el paquete java. que esta forma de pasar de un objeto wrapper a una variable primitiva y viceversa. En el siguiente esquema. Se usan diversos métodos de estas clases cuando se necesita convertir cadenas que contienen números hacia valores int o float u otros tipos numéricos (por ejemplo. que permite recuperar en forma de valor primitivo el valor envuelto por el objeto: Integer i1 = new Integer(23). en el package java. Pero a partir de la versión 5. y se obtienen luego los valores contenidos para pasarlos a variables primitvas comunes.floatValue(). Valerio Frittelli 11 .Ficha de Estudio: Listas Genéricas . int i2 = i1.util de Java (aunque podría hacerse) pero no hay problema en tomarlo como modelo y entender que quienes lo programaron aplicaron ideas y conocimientos que surgen de materias como la nuestra. Notar que estas clases están marcadas ellas mismas como final (no pueden ser derivadas) y sus atributos también son final (el valor de los atributos no puede modificarse una vez creado el objeto). y dotando a la clase de métodos para manejar el valor almacenado. al usar los métodos de la clase JOptionPane para cargar números por teclado. Note. El lenguaje Java provee una serie de clases que permiten representar valores de tipos primitivos como objetos.util. y existe una por cada tipo primitivo: Tipo primitivo byte short int long float double char boolean Wrapper class Byte Short Integer Long Float Double Character Boolean Todas estas clases proveen métodos para convertir el valor contenido a un String y viceversa. para manejar objetos de clases que representan estructuras de datos ya implementadas en Java. por ejemplo.0 Ing. charValue(). se crean objetos de algunas de estas clases primitivas.parseFloat()).charValue(). Character c1 = new Character('$').Listas Homogéneas – Clases de Envoltorio haremos en búsqueda de elementos que aporten novedades.) Clases de Envoltorio (Wrapper Classes). Note que cada clase de envoltorio provee al menos un método de la forma intValue(). float f2 = f1.intValue(). etc. además de métodos para acceder al valor representado.34f). curiosidades o simplificaciones. sin embargo. Float f1 = new Float(2.

SimpleList d = new SimpleList(). y es por supuesto mucho más cómoda... y esto implica que un objeto de cualquier clase wrapper puede ser insertado en una SimpleList sin problemas.0 o posterior de Java: // asignación de primitivos en objetos wrapper. agradecidos. System. auto-boxing facilita las cosas. pero el compilador ya no exige un new explícito: ese new es insertado en forma automática por el compilador. int i2 = i1. y compilará si usted dispone de un compilador desde la versión 5.. // otra vez. ya que en la práctica no es necesario que el programador creer objetos wrapper. Float y Character. ) Por otra parte.. Observe que en las tres primeras lineas se están creando tres objetos de las clases Integer. int x = (Integer) d. // acá esta haciendo auto-boxing. el compilador realiza el mismo servicio que ya realiza cuando se asigna directamente una cadena sobre una referencia de tipo String (y los programadores.out. Character c1 = '$'. // extracción del valor contenido en el objeto. char c2 = c1. Lo que sigue es equivalente al esquema anterior. El siguiente es un pequeño ejemplo tomado del modelo TSB-SimpleList3: // una lista de números. En esto. con auto-boxing. y el valor primitivo que está a la derecha del operador de asignación es automáticamente enviado al constructor de la clase wrapper que esté participando en forma implícita. Por cierto. Valerio Frittelli - 12 ...Listas Homogéneas – Clases de Envoltorio esto sigue siendo válido (lo anterior obviamente compilará en las nuevas versiones del lenguaje). pero con auto-boxing. todas las clases wrapper implementan la interface Comparable..getFirst(). sino que puede insertar o remover directamente números y el auto-boxing hace el resto en forma automática.addLast(new Integer(6)). // auto-deboxing.getLast(). // auto-deboxing… float f2 = f1. pero también está disponible la posibilidad de pasar en forma directa entre los objetos wrapper y las variables primitivas: esta característica se conoce como auto-boxing (cuando se asigna valor primitivo directamente sobre una referencia de tipo wrapper) o como auto-deboxing (cuando se asigna un objeto wrapper directamente sobre una variable primitiva)... d.34f.Ficha de Estudio: Listas Genéricas .. Integer i1 = 23. d.println( "\nLista de numeros: " + d ).. int y = (Integer) d. Ing. Float f1 = 2... // ok… d.addLast(8).addFirst(4)..