定义
public static void printList(List<?> list) {
for (Object elem : list){
System.out.println(elem + " ");
}
}
public static <T> void printList2(List<T> list) {
for (T elem : list){
System.out.println(elem + " ");
}
}
使用
MyList.printList(Arrays.asList(1, 2, 3));
MyList.printList2(Arrays.asList(1, 2, 3));
<?> peut être écrit arbitrairement sans restrictions,
<T> nécessite que les endroits où T apparaît soient du même type générique
L'effet est le même, mais <T> n'exige pas que les endroits où T apparaît soient du même type. En fait, les deux méthodes ci-dessus sont compilées en bytecode et List<?>
Mais le deuxième usage ne joue aucun rôle dans le développement réel. Pourquoi, à moins que le générique soit le type qui déclare la valeur de retour, ou qu'il soit déclaré au niveau de la classe. Par exemple
ou
Cela a fonctionné.
Sinon, utilisez-le comme ça
public static <T> void fun1(List<T> list)
Quel est le rôle des génériques ici ? Je ne vois vraiment pas quel effet cela a. Il faut dire qu’il n’est pas nécessaire de l’utiliser de cette façon.
? T et T représentent tous deux des types incertains, mais l'utilisation de T peut effectuer des opérations sur les objets, telles que return <T>t; .
.List<?>
est la superclasse deList<T>
et peut être utilisée partout oùList<?>
peut être utiliséeList<T>