2010-01-05 14 views
6

El siguiente código imprime maravillosos "funciona"genéricos en maravilloso

def printIt(Class<? extends Exception> clazz) { 
    println "it works" 
} 

printIt(String.class) 

aunque el parámetro no satisface la restricción Class<? extends Exception>

Mi opinión es que esto se debe a:

  1. La supresión de tipo en los genéricos de Java significa que no hay comprobación de tipo genérico en tiempo de ejecución
  2. No hay comprobación de tipo de tiempo de compilación en Groovy

Estos dos puntos significan que efectivamente no hay verificación de tipos genéricos limitados en Groovy. ¿Hay alguna manera de comprobar (en tiempo de ejecución) que el objeto pasa a ClassprintIt satisface la restricción ? extends Exception

Gracias, Don

Respuesta

4

Control hacia fuera este link.

[...] De alguna manera esto está reñido con la énfasis de los lenguajes dinámicos, donde en general, el tipo de objetos no puede ser determinado hasta que tiempo de ejecución. Pero Groovy tiene como objetivo acomodar la tipificación estática de Java cuando sea posible, por lo tanto, Groovy 1.5 ahora también comprende Genéricos. Una vez dicho esto, el soporte genérico de Groovy no pretende ser un clon completo de los genéricos de Java. En su lugar, maravilloso tiene como objetivo permitir que los genéricos a nivel de código fuente (a la ayuda cortar y pegar de Java) y también donde que tiene sentido para permitir una buena integración entre Groovy y Java herramientas y APIs que utilizan los genéricos. [. ..]

En conclusión, no creo que sea posible obtener esa información en tiempo de ejecución.

+0

Me pregunto qué significa exactamente: 'Groovy actualmente hace un poco más lejos y arroja información genérica "en el nivel de origen"' –

+1

Creo que esto significa que la información genérica simplemente se ignora en groovy. En Java, la información genérica se elimina pero se realizan los moldes apropiados y la verificación de tipo estático. –

1

Puesto que usted sabe que se supone que ser una excepción, esto funciona en Java (o maravilloso):

// true if the class is a subclass of Exception 
Exception.class.isAssignableFrom(clazz); 

que de ninguna manera utiliza la información genérica, pero que no estaría disponible en Java tampoco.