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 String
se sustituyó T extends String & AutoClosable
; String
no 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.
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 main
declaració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.