java sirve Método principal con parámetro genérico; ¿Por qué funciona?



personalizar joptionpane (1)

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

JLS §4.4. Tipo de variables:

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.

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.




type-inference