método principal con parámetro genérico; ¿por qué funciona?

Jacob G.:
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 sería compilar y ejecutar con éxito, y lo hace! Sin embargo, también me preguntaba qué pasaría si T extends Stringse sustituyó T extends String & AutoClosable; Stringno implementa AutoClosable, por lo que no me esperaba esto para ejecutar con éxito, pero aún así!

public static <T extends String & AutoCloseable> void main(T[] args) {
    System.out.println("This still works!");
}

Así que mi pregunta es, ¿por qué este sigue funcionando con éxito?

notas :

  • Estoy probando esto con Java 10.0.1
  • Intellij no se lleva bien con este método, ya que no lo ve como un punto de entrada al programa; No he probado con otros entornos de desarrollo.
  • También es capaz de pasar argumentos utilizando la línea de comandos tal como lo haría con cualquier otro programa.
Oleksandr Pyrohov:

Esto es porque un parámetro de tipo tiene una cota:

<T extends String>                  =>  String

<T extends String & AutoCloseable>  =>  String & AutoCloseable

Y el código de bytes después de borrado es el mismo que para el normal maindeclaración en ambos casos:

public static main([Ljava/lang/String;)V

JLS §4.4. Las variables de tipo:

El orden de los tipos de un salto sólo es significativo en que el borrado de una variable de tipo se determina por el primer tipo en su límite , y que un tipo de clase o tipo variable sólo puede aparecer en la primera posición.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=37535&siteId=1
Recomendado
Clasificación