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:
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
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.