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: 2021/03/10 13:16 by Santiago Faci