apuntes:genericos
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| apuntes:genericos [2021/03/10 13:16] – created Santiago Faci | apuntes:genericos [2023/05/28 12:04] (current) – [El comodín ?] Santiago Faci | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Genéricos ====== | ====== Genéricos ====== | ||
| - | \section{Genéricos} | + | ===== Genéricos |
| El uso más conocido de los genéricos lo vimos en el tema anterior, con las colecciones, | El uso más conocido de los genéricos lo vimos en el tema anterior, con las colecciones, | ||
| lo que permite que podamos definir estructuras de la siguiente forma: | lo que permite que podamos definir estructuras de la siguiente forma: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| List< | List< | ||
| - | \end{lstlisting} | + | </ |
| Lo que permite que, si cometemos algún error como este, podamos ser avisados en tiempo de compilación: | Lo que permite que, si cometemos algún error como este, podamos ser avisados en tiempo de compilación: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| Integer i = listaCadenas.get(0); | Integer i = listaCadenas.get(0); | ||
| - | \end{lstlisting} | + | </ |
| Sin la existencia de los genéricos, la línea anterior sería como esta: | Sin la existencia de los genéricos, la línea anterior sería como esta: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| Integer i = listaCadenas.get(0); | Integer i = listaCadenas.get(0); | ||
| - | \end{lstlisting} | + | </ |
| Y nunca produciría ningún error de compilación en caso de que estuvieramos cometiendo algún error. A este respecto conviene saber que los | Y nunca produciría ningún error de compilación en caso de que estuvieramos cometiendo algún error. A este respecto conviene saber que los | ||
| - | genéricos sólo existen a nivel de compilación, | + | genéricos sólo existen a nivel de compilación, |
| necesarios para que el código pueda ejecutarse sin problemas. | necesarios para que el código pueda ejecutarse sin problemas. | ||
| - | \subsection{Definición de una clase genérica} | + | ==== Definición de una clase genérica |
| El siguiente fragmento de código se correspondería con la definición de una clase genérica: | El siguiente fragmento de código se correspondería con la definición de una clase genérica: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| public class Grupo< | public class Grupo< | ||
| private List< | private List< | ||
| Line 59: | Line 59: | ||
| } | } | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| De esa forma, una definición genérica como la anterior, puede emplearse con distintos tipos de datos: | De esa forma, una definición genérica como la anterior, puede emplearse con distintos tipos de datos: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| Grupo< | Grupo< | ||
| . . . | . . . | ||
| Grupo< | Grupo< | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| Como has podido ver en la definición, | Como has podido ver en la definición, | ||
| Line 74: | Line 74: | ||
| clase genérica. A este respecto se suelen utilizar diferentes letras para diferentes situaciones: | clase genérica. A este respecto se suelen utilizar diferentes letras para diferentes situaciones: | ||
| - | \begin{itemize} | + | * '' |
| - | \item \verb E para definir un elemento de una colección | + | * '' |
| - | \item \verb K para definir una clave en un mapa | + | * '' |
| - | \item \verb V para definir un valor en un mapa | + | * '' |
| - | \item \verb T , \verb U para definir tipos de datos (clases) | + | |
| - | \end{itemize} | + | |
| - | \subsection{Métodos genéricos} | + | ==== Métodos genéricos |
| Así como se pueden definir clases genéricas, también podemos definir métodos genéricos dentro de clases que no lo sean: | Así como se pueden definir clases genéricas, también podemos definir métodos genéricos dentro de clases que no lo sean: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| public class Utils { | public class Utils { | ||
| public <T> T getUltimoElemento(ArrayList< | public <T> T getUltimoElemento(ArrayList< | ||
| Line 91: | Line 89: | ||
| } | } | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| - | De esa manera, se podrá invocar al método | + | De esa manera, se podrá invocar al método |
| - | \subsection{El comodín ?} | + | ==== El comodín ? ==== |
| - | También se puede utilizar el caracter comodín | + | También se puede utilizar el caracter comodín |
| \verb ArrayList | \verb ArrayList | ||
| - | \begin{lstlisting}[language=java] | + | < |
| . . . | . . . | ||
| public void metodo(ArrayList<?> | public void metodo(ArrayList<?> | ||
| Line 107: | Line 105: | ||
| } | } | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| Para este caso también podemos aprovecharnos de las características de la herencia para la definición de métodos genéricos, pudiendo definir el uso de la | Para este caso también podemos aprovecharnos de las características de la herencia para la definición de métodos genéricos, pudiendo definir el uso de la | ||
| Line 114: | Line 112: | ||
| Para aceptar cualquier clase que extienda de una determinada clase: | Para aceptar cualquier clase que extienda de una determinada clase: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| . . . | . . . | ||
| public void Zoo { | public void Zoo { | ||
| Line 125: | Line 123: | ||
| } | } | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| Y para aceptar cualquier clase que esté por encima de una determinada clase: | Y para aceptar cualquier clase que esté por encima de una determinada clase: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| . . . | . . . | ||
| public void Zoo { | public void Zoo { | ||
| Line 140: | Line 138: | ||
| } | } | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| De esa manera, podremos invocar al método \verb anadir | De esa manera, podremos invocar al método \verb anadir | ||
| Line 146: | Line 144: | ||
| siguientes clases: | siguientes clases: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| public class Animal { | public class Animal { | ||
| . . . | . . . | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| - | \begin{lstlisting}[language=java] | + | < |
| public class Leon extends Animal { | public class Leon extends Animal { | ||
| . . . | . . . | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| - | \begin{lstlisting}[language=java] | + | < |
| public class Zoo { | public class Zoo { | ||
| . . . | . . . | ||
| Line 167: | Line 165: | ||
| . . . | . . . | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| Las siguiente invocaciones producirían un error de compilación por incompatibilidad de tipos: | Las siguiente invocaciones producirían un error de compilación por incompatibilidad de tipos: | ||
| - | \begin{lstlisting}[language=java] | + | < |
| . . . | . . . | ||
| Zoo zoo = new Zoo(. . .); | Zoo zoo = new Zoo(. . .); | ||
| Line 178: | Line 176: | ||
| zoo.anadirAnimales(leones); | zoo.anadirAnimales(leones); | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| Es por eso que tenemos que usar lo que se conoce como los comodínes. | Es por eso que tenemos que usar lo que se conoce como los comodínes. | ||
| Line 184: | Line 182: | ||
| Para el caso de las clases genéricas y métodos genéricos también podemos jugar con las características de herencia, utilizando las mismas | Para el caso de las clases genéricas y métodos genéricos también podemos jugar con las características de herencia, utilizando las mismas | ||
| expresiones que podemos usar con el comodín, pero con el caracter que empleemos para referirnos a la clase genérica. A diferencia del uso | expresiones que podemos usar con el comodín, pero con el caracter que empleemos para referirnos a la clase genérica. A diferencia del uso | ||
| - | del comodín | + | del comodín |
| - | \begin{lstlisting}[language=java] | + | < |
| public class Grupo<E extends Persona> { | public class Grupo<E extends Persona> { | ||
| private List< | private List< | ||
| Line 215: | Line 213: | ||
| } | } | ||
| } | } | ||
| - | \end{lstlisting} | + | </ |
| - | \begin{lstlisting}[language=java] | + | < |
| . . . | . . . | ||
| public <T extends Animal> T getAnimal(ArrayList< | public <T extends Animal> T getAnimal(ArrayList< | ||
| Line 226: | Line 224: | ||
| } | } | ||
| . . . | . . . | ||
| - | \end{lstlisting} | + | </ |
| + | |||
| + | ---- | ||
| + | |||
| + | (c) 2019-{{date> | ||
apuntes/genericos.1615382177.txt.gz · Last modified: by Santiago Faci
