web-dev-qa-db-fra.com

Méthode principale avec paramètre générique; pourquoi ça marche?

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

J'étais curieux de voir si l'extrait de code ci-dessus se compilerait et fonctionnerait correctement, et c'est le cas! Cependant, je me suis également demandé ce qui se passerait si T extends String a été remplacé par T extends String & AutoClosable; String n'implémente pas AutoClosable, donc je ne m'attendais pas à ce que cela fonctionne avec succès, mais c'est toujours le cas!

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

Donc, ma question est, pourquoi cela fonctionne-t-il toujours avec succès?

Notes:

  • Je teste cela avec Java 10.0.1
  • Intellij ne joue pas Nice avec cette méthode car il ne le voit pas comme un point d'entrée au programme; Je ne l'ai pas testé avec d'autres IDE.
  • Vous pouvez également passer des arguments en utilisant la ligne de commande comme vous le feriez avec n'importe quel autre programme.
35
Jacob G.

En effet, un paramètre de type a une limite:

<T extends String>                  =>  String

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

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

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

JLS §4.4. Variables de type:

L'ordre des types dans une borne n'est significatif que dans la mesure où l'effacement d'une variable de type est déterminé par le premier type dans sa borne , et qu'une classe type ou variable de type ne peut apparaître qu'en première position.

31
Oleksandr Pyrohov