36 votes

Méthode principale avec paramètre générique; pourquoi cela fonctionne-t-il?

public static <T extends String> void main(T[] args) {
    System.out.println("Hello World!");
}

J'étais curieux de voir si l'extrait ci-dessus du code de compiler et d'exécuter avec succès, et il le fait! Cependant, je me suis aussi demandé ce qui se passerait si T extends String a été remplacé par T extends String & AutoClosable; String ne met pas en oeuvre AutoClosable, donc je n'ai pas que ça à exécuter avec succès, mais cela ne fonctionne toujours!

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

Donc ma question est, pourquoi est-ce toujours exécuter avec succès?

Notes:

  • Je suis en essais ce avec Java 10.0.1
  • L'ide n'est pas jouer gentil avec cette méthode car elle ne voit pas cela comme un point d'entrée pour le programme, je ne l'ai pas testé avec d'autres IDEs.
  • Vous êtes également capable de passer des arguments à l'aide de la ligne de commande comme vous le feriez avec n'importe quel autre programme.

31voto

Oleksandr Points 7545

C'est parce qu'un paramètre de type a d'un bond:

<T extends String>                  =>  String

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

Et le bytecode après l'effacement est la même que pour l' main déclaration dans les deux cas:

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

JLS §4.4. Les Variables De Type:

L'ordre des types dans une limite n'est significative que dans l'effacement d'une variable de type est déterminé par le premier type dans son lié, et qu'un type de classe ou de type de variable ne peut apparaître que dans le premier position.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X