This content originally appeared on DEV Community and was authored by Elías Canales
Los tipos genéricos son aquellas interfaces o clases qque tienen uno o más parámetros de tipo. Los parámetros de tipo van entre el signo mayor que y el signo menor que (<>).
Antes de que existieran para objetos como las listas tenías que castear cada objeto, ahora mismo eso no es necesario, siempre y cuando no uses tipos raw.
//Definiendo el tipo de la lista
List<String> l = new ArrayList<>();
l.add("1234");
String s = l.getFirst();
//Usando RAW types
List l2 = new ArrayList();
l.add("1234");
String s2 = (String) l2.getFirst();
Usar tipos raw no es recomendado, principalmente porque no podrás tener ayuda del compilador, y los errores te ocurrirán en tiempo de ejecución, los cuales son más complejos de solucionar.
Y por otro lado, en los tipos raw siempre tendrás que castear, lo cual puede llevar a algún error de ejecución, además recibirás algunas advertencias que no son agradables y que son precisamente porque podrías tener errores.
Lo mejor es saber qué estamos haciendo y a ser posible no tener ningún warning (typesafe), es la única manera de asegurar que todo funcionará como nosotros esperamos, o acercarnos lo máximo posible.
En caso de necesitar guardar distintos tipos en una misma lista, tienes varias opciones, una podría ser guardar tener una lista de Object, no es la opción más óptima, y como normalmente a esa lista querrás aplicarle alguna operación es probable que quieras usar un tipo por medio de una interfaz.
Cuando definimos una lista como hemos dicho, lo mejor es tener un tipo, de esa forma en la definición no tendremos warnings, si no sabemos el tipo o podrían ser varios, y solo vamos a hacer operaciones de lectura podemos usar “?”.
//RAW type
List warning;
//Specific type
List<String> noWarning;
//Only to read without warning
List<?> readOnly;
Al crear la lista, tenemos que decirle el tipo, aunque la mejor opción actualmente es inducirlo con tan solo poner “<>”.
//Raw type warning on creation
List<String> warning = new ArrayList();
//Infer type
List<String> noWarning = new ArrayList<>();
Referencias
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.
This content originally appeared on DEV Community and was authored by Elías Canales