2012-09-19 12 views

Respuesta

3

Los genéricos son muy difíciles.

En este caso Arrays.asList devolverá List<Class<MyOwnException>>, que no es lo mismo que List<Class<? extends Throwable>>.

Su comportamiento será diferente ya que el tipo List<Class<? extends Throwable>> le permitirá agregar objetos que se extienden Throwable pero List<Class<MyOwnException>> solo aceptan objetos del tipo MyOwnException.

+1

Eso no es verdad que tienen que ser "exactamente lo mismo": 'Lista x = new ArrayList ();' compila, como lo hace 'List x = new ArrayList (); ' – Bohemian

+0

Tienes razón, bohemio, acabo de corregir la segunda parte, que no era verdad. Mal horas para responder rápidamente. ¡Gracias! – enTropy

0

Si el segundo ejemplo fueron a trabajar, a permitir el código como el siguiente:

Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
exs.add(IOException.class); 

ver el problema? Arrays.asList() devolvería un List<Class<MyOwnException>>, y luego estaría tratando de insertar un Class<IOException> en eso. Eso es obviamente un desajuste de tipo.

1

La primera línea funciona porque el tipo del elemento del lado derecho de la asignacion (del ArrayList) es Class<? extends Throwable> que permite añadir cualquier tipo de Class<? extends Throwable> objeto, incluyendo su MyOwnException. También puede añadir a la primera línea Collection un Exception.class o una NullPointerException.class, etc.

Pero la segunda línea es mucho más estricta: usted tiene un Collection<Class<? extends Throwable>> que podrían contener una Class<Exception>, un Class<NullPointerException>, etc., y que desea poner en colocar una Collection<Class<MyOwnException>> que no permite Class<Exception>, etc.

6

la razón es un error es que java se infiere el tipo incorrecto, pero puede que se compile, sin poner en , especificando el tipo de la llamada para el método mecanografiado Arrays.asList():

Collection<Class<? extends Throwable>> exs 
    = Arrays.<Class<? extends Throwable>>asList(Exception.class); // compiles 

sin especificar el tipo, java infiere el tipo de elemento de la colección para ser Class<Exception>, que es no asignable a Collection<Class<? extends Throwable>>.

recuerdo con los genéricos que si se extiende BA, List<B> hace no extienden List<A>.

+0

+1, pero tengo una pregunta. ¿Por qué una variable local no se define como 'Clase clazz' haz el truco en 'Arrays.asList (clazz)'? – Raffaele

+1

@Raffaele Porque el tipo se deduce del parámetro 'asList' como' Class ', pero necesita que sea diferente – Bohemian

+0

En realidad, el compilador de Eclipse dice' List > a List > ', no menciona' Class ', pero no puedo interpretar la * capture # 1 * part ... – Raffaele

1

Arrays.asList(MyOwnException.class) se infiere que tiene el tipo List<Class<MyOwnException>>, que no es compatible con List<Class<? extends Throwable>> ya que los parámetros de tipo son diferentes.

Si pones un comodín en el primer nivel, que debería funcionar:

Collection<? extends Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
Cuestiones relacionadas