{"id":2371,"date":"2018-02-22T19:28:08","date_gmt":"2018-02-23T00:28:08","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2371"},"modified":"2018-02-23T05:41:52","modified_gmt":"2018-02-23T10:41:52","slug":"colecciones-parametrizadas","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2371","title":{"rendered":"Colecciones parametrizadas"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2374\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java37-300x113.jpg\" alt=\"\" width=\"281\" height=\"106\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java37-300x113.jpg 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java37.jpg 331w\" sizes=\"(max-width: 281px) 100vw, 281px\" \/><\/p>\n<p><span style=\"color: #000000;\">Las colecciones hist\u00f3ricas y las desarrolladas en Java 2 guardan, internamente, los elementos en arrays de tipo Object. Con esto se consigue la m\u00e1xima generalizaci\u00f3n ya que Object es la clase base de cualquier objeto Java.\u00a0<\/span><!--more--><\/p>\n<p><span style=\"color: #000000;\">Esto permite que una colecci\u00f3n guarde objetos de cualquier tipo, por ejemplo una lista puede contener cadenas (String), n\u00fameros racionales . . . :\u00a0<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0LinkedList lis = new LinkedList();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Racional r = new Racional(3,7);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0lis.add(r);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0lis.add(newString(\u00abMi globo\u00bb));<\/span><\/p>\n<p><span style=\"color: #000000;\">Al recuperar elementos de la lista es necesario discernir el tipo concreto de elemento, por ejemplo:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Object q;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Racional t;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0q = lis.getFirst();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0if(q instanceof Racional)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 t = (Racional) q;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 . . .<\/span><\/p>\n<p><span style=\"color: #000000;\">En muchas aplicaciones de colecciones los elementos son del mismo tipo, un conjunto de enteros, una lista de palabras . . . a pesar de lo cual la recuperaci\u00f3n de elementos siempre necesita una conversi\u00f3n de Object a ese tipo. Por esta raz\u00f3n, y otras como que el compilador pueda realizar comprobaciones de tipo, a partir de Java 5 se amplia la declaraci\u00f3n de todas las clases e interfaces relacionadas con colecciones para dotarlas de la posibilidad de parametrizar el tipo que va a tener los elementos de una colecci\u00f3n. Por ejemplo, un vector que vaya a guardar elementos de tipo Complex se declarar\u00e1 e instanciar\u00e1:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Vector&lt;Complex&gt; zz;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0zz = new Vector&lt;Complex&gt;(19);<\/span><\/p>\n<p><span style=\"color: #000000;\">La funcionalidad de Vector no cambia, aunque el compilador si comprobar\u00e1 tipos de datos al realizar operaciones, como por ejemplo a\u00f1adir elementos:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Complex nz = new Complex(1,-1);<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0zz.addElement(new Integer(8));\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ error de compilaci\u00f3n, tipo mismatch<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0zz.addElement(nz);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ correcto<\/span><\/p>\n<p><span style=\"color: #000000;\"><span style=\"color: #000000;\">La recuperaci\u00f3n de elementos ya no necesita conversi\u00f3n de Object a Complex:<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0nz = zz.elementAt(0);<\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Declaraci\u00f3n de un tipo parametrizado<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">Al nombre de la colecci\u00f3n le sigue el tipo de los elementos entre par\u00e9ntesis angulares (&lt;tipo&gt;):<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Coleccion&lt;tipo&gt; v;<\/span><\/p>\n<p><span style=\"color: #000000;\">Si se parametrizan dos tipos, como ocurre con los mapas, se separan con coma:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Coleccion&lt;tipoClave, tipoValor&gt; cc;<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Stack&lt;Double&gt; pila;<\/span><\/p>\n<p><span style=\"color: #000000;\">Realmente con el tipo parametrizado es como si se hubiera declarado otra clase, en consecuencia las instancias de colecciones parametrizadas se crean con esa clase, es decir <strong>new Coleccion&lt;tipo&gt;<\/strong> crea la instancia.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0pila = new Stack&lt;Double&gt;();<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Sintaxis<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">A continuaci\u00f3n del nombre de la clase se especifican los tipos parametrizados entre par\u00e9ntesis angulares:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Coleccion&lt;tipo1 . . . &gt; var;<\/span><\/p>\n<p><span style=\"color: #000000;\">Para crear instancias new Coleccion&lt;tipo1 . . . &gt;();<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las colecciones hist\u00f3ricas y las desarrolladas en Java 2 guardan, internamente, los elementos en arrays de tipo Object. Con esto se consigue la m\u00e1xima generalizaci\u00f3n ya que Object es la clase base de cualquier objeto Java.\u00a0<\/p><p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2371\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2374,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2371"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2371"}],"version-history":[{"count":22,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2371\/revisions"}],"predecessor-version":[{"id":2395,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2371\/revisions\/2395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2374"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}