titledborder poner definicion borderlayout borde java generics type-parameter bounded-wildcard

java - poner - ¿Cuál es la diferencia entre el comodín delimitado y los parámetros de tipo?



set border java (2)

En este caso particular, no. sin embargo, la segunda opción es más flexible, ya que le permitiría devolver una colección que contiene elementos de un tipo diferente (aunque también sería un Número) que el tipo que contiene el parámetro de recopilación.

Ejemplo concreto:

Collection<? extends Number> getRoot(Class<? extends Number> number){ ArrayList<Integer> result=new ArrayList<Integer>(); result.add(java.util.Math.round(number); return result) }

¿Hay alguna diferencia entre

<N extends Number> Collection<N> getThatCollection(Class<N> type)

y

Collection<? extends Number> getThatCollection(Class<? extends Number>)


Exponen diferentes interfaces y contratan el método.

La primera declaración debe devolver una colección cuyos elementos tipo es el mismo de la clase argumento. El compilador infiere el tipo de N (si no se especifica). Entonces las siguientes dos declaraciones son válidas cuando se usa la primera declaración:

Collection<Integer> c1 = getThatCollection(Integer.class); Collection<Double> c2 = getThatCollection(Double.class);

La segunda declaración no declara la relación entre el argumento del tipo de Colección devuelto a la clase de argumento. El compilador supone que no están relacionados, por lo que el cliente debería usar el tipo devuelto como Collection<? extends Number> Collection<? extends Number> , independientemente de cuál sea el argumento:

// Invalid statements Collection<Integer> c1 = getThatCollection(Integer.class); // invalid Collection<Double> c2 = getThatCollection(Double.class); // invalid Collection<Number> cN = getThatCollection(Number.class); // invalid // Valid statements Collection<? extends Number> c3 = getThatCollection(Integer.class); // valid Collection<? extends Number> c4 = getThatCollection(Double.class); // valid Collection<? extends Number> cNC = getThatCollection(Number.class); // valid

Recomendación

Si de hecho hay una relación entre el tipo entre el argumento de tipo devuelto y el argumento pasado, es mucho mejor usar la primera declaración. El código del cliente es más limpio como se indicó anteriormente.

Si la relación no existe, entonces es mejor evitar la segunda declaración. Tener un tipo devuelto con un comodín delimitado obliga al cliente a utilizar comodines en todas partes, por lo que el código del cliente se vuelve ruidoso e ilegible. Joshua Bloch enfatiza que debe evitar los comodines delimitados en los tipos de devolución (diapositiva 23). Si bien los comodines delimitados en los tipos de devolución pueden ser útiles en algunos casos, la fealdad del código resultante debe, en mi humilde opinión, anular el beneficio.