sirve showmessagedialog showinputdialog que personalizar para mostrar mensaje error java generics main type-inference

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

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.