Sep 28

Un detalle de los genéricos de Java

Simplemente, una pequeña cosa que no sabía de los genéricos de java y que me ha llamado la atención.

Supongamos que tenemos un método que pretendemos que reciba una LinkedList de números y nos devuelva la suma de todos ellos. La LinkedList es un genérico y queremos ponerla concreta. Se nos puede ocurrir, por ejemplo, poner esto

public double suma (LinkedList<Number> listaNumeros) {
   …
}

Esto tiene una pequeña pega. Podemos instanciar una LinkedList<Number> y meter ahí cualquier tipo de número, como Float, Integer, Double, etc. La llamada al método funcionará perfectamente

LinkedList<Number> lista = new LinkedList<Number>();
lista.add (new Integer(3));
lista.add (new Float(2.2));

double resultado = suma (lista);

Sin embargo, si instanciamos una LinkedList<Double>, LinkedList<Integer>, … dará error al llamar al método, puesto que no es lo que el método espera de parámetro, una clase LinkedList<Number>.

El truco, que es lo que me ha llamado la atención, es declarar el método con una sintaxis tan extraña como esta

public double suma (LinkedList<?extends Number> listaNumeros) {
   …
}

De esta forma, admite cualquier LinkedList<Cosa> donde Cosa sea una clase que herede de Number, es decir, cualquiera de las que mencionamos anteriormente.

Entradas relacionadas:

  • No hay entradas relacionadas.

Leave a Reply