java - showmessagedialog - Método principal con parámetro genérico; ¿Por qué funciona?
pack java para que sirve (1)
public static <T extends String> void main(T[] args) {
System.out.println("Hello World!");
}
Tenía curiosidad por ver si el fragmento de código anterior se compilaría y se ejecutaría con éxito, ¡y lo hace! Sin embargo, también me preguntaba qué pasaría si T extends String
fuera reemplazado por T extends String & AutoClosable
; String
no implementa AutoClosable
, así que no esperaba que esto se ejecutara correctamente, ¡pero aún funciona!
public static <T extends String & AutoCloseable> void main(T[] args) {
System.out.println("This still works!");
}
Entonces mi pregunta es, ¿por qué esto todavía se ejecuta con éxito?
Notas :
- Estoy probando esto con Java 10.0.1
- Intellij no juega bien con este método porque no lo ve como un punto de entrada al programa; No lo he probado con otros IDEs.
- También puede pasar argumentos usando la línea de comandos tal como lo haría con cualquier otro programa.
Esto se debe a que un parámetro de tipo tiene un límite:
<T extends String> => String
<T extends String & AutoCloseable> => String & AutoCloseable
Y el bytecode después del borrado es el mismo que para la declaración main
regular en ambos casos:
public static main([Ljava/lang/String;)V
El orden de los tipos en un límite es significativo, ya que el borrado de una variable de tipo está determinado por el primer tipo en su límite , y un tipo de clase o variable de tipo solo puede aparecer en la primera posición.