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.