{"id":60,"date":"2019-04-25T16:55:03","date_gmt":"2019-04-25T22:55:03","guid":{"rendered":"https:\/\/iscodigo.wordpress.com\/?p=60"},"modified":"2025-02-12T07:06:24","modified_gmt":"2025-02-12T07:06:24","slug":"uso-de-genericos-en-java","status":"publish","type":"post","link":"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/","title":{"rendered":"Uso de Gen\u00e9ricos en Java"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_72 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/#Problema\" title=\"Problema\">Problema<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/#Solucion_1_Una_lista_por_cada_tipo_de_datos\" title=\"Soluci\u00f3n 1: Una lista por cada tipo de datos\">Soluci\u00f3n 1: Una lista por cada tipo de datos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/#Solucion_2_Uso_de_Object\" title=\"Solucion 2: Uso de Object\">Solucion 2: Uso de Object<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/#Solucion_3_Genericos\" title=\"Soluci\u00f3n 3: Gen\u00e9ricos\">Soluci\u00f3n 3: Gen\u00e9ricos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/iscodigo.com\/blog\/algorithm\/uso-de-genericos-en-java\/#Conclusiones\" title=\"Conclusiones\">Conclusiones<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problema\"><\/span>Problema<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Se necesita crear una <a href=\"https:\/\/es.wikipedia.org\/wiki\/Lista_enlazada\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"lista enlazada (abre en una nueva pesta\u00f1a)\">lista enlazada<\/a> para <strong>cualquier <\/strong>tipo de dato existente: primitivos, objetos y objetos creados por el usuario.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Solucion_1_Una_lista_por_cada_tipo_de_datos\"><\/span>Soluci\u00f3n 1: Una lista por cada tipo de datos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Para este caso decidimos crear una lista enlazada que almacene valores enteros. Esto significa que el Nodo tendr\u00e1 un dato con tipo <strong>int<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Nodo<\/span> <\/span>{\n  int dato;\n  Nodo siguiente;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Lenguaje del c\u00f3digo:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>El problema de esta situaci\u00f3n es que se crear\u00e1 una estructura que <strong>funciona solamente para datos de tipo entero<\/strong>. Cualquier otro tipo que no pueda convertirse a entero queda descartado (Por ejemplo: boolean, n\u00fameros flotantes, cadenas y casi todos los objetos). <\/p>\n\n\n\n<p>Entonces debe crearse una lista enlazada especifica para cada tipo de dato: una para los String, otra para valores boolean, otra para valores double, etc&#8230; Tantas versiones como tipos de datos se necesiten. Eso es mucho trabajo.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Solucion_2_Uso_de_Object\"><\/span>Solucion 2: Uso de Object<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>Object<\/strong> es el tipo de dato del cual se deriva cualquier tipo no primitivo en Java y al utilizar las t\u00e9cnicas del <a rel=\"noreferrer noopener\" aria-label=\"autoboxing y unboxing,  (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.geeksforgeeks.org\/autoboxing-unboxing-java\/\" target=\"_blank\">autoboxing y unboxing, <\/a>es posible convertir cualquier dato en Object y viceversa. Para el caso de los primitivos se utilizan los tipos <a rel=\"noreferrer noopener\" aria-label=\" (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.w3schools.com\/java\/java_wrapper_classes.asp\" target=\"_blank\">wrappers<\/a>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NodoObj<\/span> <\/span>{\n  <span class=\"hljs-built_in\">Object<\/span> dato;\n  NodoObj siguiente;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Lenguaje del c\u00f3digo:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>En el caso anterior es posible utilizar una sola base de c\u00f3digo para generar una lista enlazada y que sea \u00fatil para cada tipo de dato. <\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NodoObj<\/span> <\/span>{\n  <span class=\"hljs-built_in\">Object<\/span> dato;\n  NodoObj siguiente;\n  \n  public NodoObj(<span class=\"hljs-built_in\">Object<\/span> dato) {\n    <span class=\"hljs-keyword\">this<\/span>.dato = dato;\n  }\n  \n  public <span class=\"hljs-built_in\">Object<\/span> getDato() {\n    <span class=\"hljs-keyword\">return<\/span> dato;\n  }\n  \n  public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n    <span class=\"hljs-comment\">\/\/ Almacenando un dato entero<\/span>\n    NodoObj n1 = <span class=\"hljs-keyword\">new<\/span> NodoObj(<span class=\"hljs-number\">2<\/span>);\n    \n    <span class=\"hljs-comment\">\/\/ Para utilizar ese dato hay que realizar el 'unboxing'<\/span>\n    int valor = (int) n1.getDato();\n    \n    <span class=\"hljs-comment\">\/\/ No hay control del tipo de dato a insertar<\/span>\n    NodoObj n2 = <span class=\"hljs-keyword\">new<\/span> NodoObj(<span class=\"hljs-literal\">true<\/span>);    \n    NodoObj n3 = <span class=\"hljs-keyword\">new<\/span> NodoObj(<span class=\"hljs-string\">\"hola\"<\/span>);\n    NodoObj n4 = <span class=\"hljs-keyword\">new<\/span> NodoObj(n3);\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Lenguaje del c\u00f3digo:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\nPero al revisar el c\u00f3digo detenidamente se observa lo siguiente:\n\n<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>El dato de tipo Object debe convertirse de forma expl\u00edcita cada vez que se desea utilizar el tipo de dato original (unboxing).<\/li>\n\n\n\n<li>No hay una revisi\u00f3n de tipo de datos, lo cual permite que podamos establecer dentro del Nodo diferentes tipos de datos a la vez, lo cual puede ser una ventaja en ocasiones pero cuando sean necesarios datos homog\u00e9neos esto es una problema.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Solucion_3_Genericos\"><\/span>Soluci\u00f3n 3: Gen\u00e9ricos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>En este caso se hace uso similar a la soluci\u00f3n 2, de una receta general en lugar de fabricar innumerables opciones.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ La clase lleva la notacion de diamante<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NodoT<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <\/span>{\n  <span class=\"hljs-comment\">\/\/ El tipo de dato generico esta denominado como 'T'<\/span>\n  T dato;\n  \n  <span class=\"hljs-comment\">\/\/ Todas las menciones de la estructura deben<\/span>\n  <span class=\"hljs-comment\">\/\/ llevar la notacion de diamante<\/span>\n  NodoT&lt;T&gt; siguiente;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Lenguaje del c\u00f3digo:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Para este caso, hay cierta sintaxis que se agrega al c\u00f3digo. Sin embargo, una vez conocida la t\u00e9cnica resulta f\u00e1cil de utilizar.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ La clase lleva la notacion de diamante<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">NodoT<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <\/span>{\n  <span class=\"hljs-comment\">\/\/ El tipo de dato generico esta denominado como 'T'<\/span>\n  T dato;\n  \n  <span class=\"hljs-comment\">\/\/ Todas las menciones de la estructura deben llevar la <\/span>\n  <span class=\"hljs-comment\">\/\/ notacion de diamante<\/span>\n  NodoT&lt;T&gt; siguiente;\n  \n  <span class=\"hljs-keyword\">public<\/span> NodoT(T dato) {\n    this.dato = dato;\n  }\n  <span class=\"hljs-comment\">\/\/ Es posible retornar el tipo de dato generico. Cuando <\/span>\n  <span class=\"hljs-comment\">\/\/ se ejecute tomara el tipo que se establezca en<\/span>\n  <span class=\"hljs-comment\">\/\/ el constructor.<\/span>\n  <span class=\"hljs-keyword\">public<\/span> T getDato() {\n    <span class=\"hljs-keyword\">return<\/span> dato;\n  }\n  \n  <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n    <span class=\"hljs-comment\">\/\/ En el constructor se define el tipo de dato a utilizar<\/span>\n    NodoT&lt;Integer&gt; n1 = <span class=\"hljs-keyword\">new<\/span> NodoT&lt;Integer&gt;(<span class=\"hljs-number\">2<\/span>);    \n    \n    <span class=\"hljs-comment\">\/\/ Se puede utilizar el dato sin conversiones<\/span>\n    int valor = n1.getDato();\n    \n    <span class=\"hljs-comment\">\/\/ Hay revision del tipo de dato a utilizar<\/span>\n    NodoT&lt;Integer&gt; n1 = <span class=\"hljs-keyword\">new<\/span> NodoT&lt;Integer&gt;(<span class=\"hljs-string\">\"hola\"<\/span>); <span class=\"hljs-comment\">\/\/ Error<\/span>\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Lenguaje del c\u00f3digo:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hay otra observaci\u00f3n que realizar: No puede utilizarse directamente tipos primitivos en lugar de eso se utilizan las clases <a rel=\"noreferrer noopener\" aria-label=\" (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/www.w3schools.com\/java\/java_wrapper_classes.asp\" target=\"_blank\">wrappers<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusiones\"><\/span>Conclusiones<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La regla m\u00e1xima debe ser <a aria-label=\" (abre en una nueva pesta\u00f1a)\" href=\"https:\/\/es.wikipedia.org\/wiki\/No_te_repitas\" target=\"_blank\" rel=\"noreferrer noopener\">DRY<\/a>. Es decir, evitar repetir c\u00f3digo innecesario ya que esto tiende a elevar los errores y el tiempo de mantenimiento de nuestro c\u00f3digo. <\/li>\n\n\n\n<li>En este caso, la soluci\u00f3n 1 rompe la regla DRY, haciendo cambios por cada tipo de datos que se necesite incorporar a la soluci\u00f3n.<\/li>\n\n\n\n<li>Otro punto es la incorporaci\u00f3n de validaciones y preparaciones extras de los datos. En la soluci\u00f3n 2, aunque evitamos el DRY. Es necesario validar que los datos que ingresamos o retornamos son del tipo que corresponden. Esto en una soluci\u00f3n automatizada resulta en una desarrollo que puede irse complicando por cada caso.<\/li>\n\n\n\n<li>Aunque se incorporan ciertos elementos nuevos como la sintaxis de las estructuras gen\u00e9ricas y el hecho de que no se pueden utilizar directamente tipos primitivos, la soluci\u00f3n 3 es la mejor opci\u00f3n de las soluciones a largo plazo: evita el DRY y las validaciones a los datos de entrada y salida de nuestra estructura de datos.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Problema Se necesita crear una lista enlazada para cualquier tipo de dato existente: primitivos, objetos y objetos creados por el usuario. Soluci\u00f3n 1: Una lista por cada tipo de datos Para este caso decidimos crear una lista enlazada que almacene valores enteros. Esto significa que el Nodo tendr\u00e1 un dato con tipo int. El problema [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,6],"tags":[],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","category-algorithm","category-java"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":1,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":1767,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions\/1767"}],"wp:attachment":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/categories?post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/tags?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}