Parce que ce type générique non lié s'efface pour Object
cela reviendrait à passer Object
dans votre constructeur :
public class Foo {
Object o;
public Foo(Object o) {
this.o = o;
}
}
...mais comme passer un blanc Object
à moins que vous ne fassiez quelque chose astucieux mais cela n'a guère de valeur pratique.
Vous voyez des avantages et des gains si vous passez en lié génériques à la place, ce qui signifie que vous pouvez réellement avoir des garanties autour du type qui vous intéresse.
public class Foo<T extends Collection<?>> {
T collection;
public Foo(T collection) {
this.collection = collection;
}
}
En fait, il s'agit plus d'une question de flexibilité que de quelque chose de révolutionnaire. Si vous voulez avoir la flexibilité de passer dans une catégorie spécifique de types, alors vous avez le pouvoir de le faire ici. Si vous Ne le fais pas. alors il n'y a pas de problème avec les classes standard. Il est simplement là pour votre commodité, et puisque l'effacement de type est toujours une chose, un générique non lié est le même (et a la même utilité) que passer Object
.
11 votes
Peut-être dans des situations comme celle-ci :
<U> Bar(U a, U b)
?1 votes
Cet exemple n'est pas très utile. Mais les génériques vous aideraient à établir des contrats sur les arguments lorsque U devrait étendre un autre type ou être un type d'intersection. (par exemple, <U étend Serializable>)
7 votes
Les méthodes génériques sont utiles. Les constructeurs sont similaires aux méthodes. Il serait plus difficile de interdire que de les autoriser, même s'il n'y a pas de cas d'utilisation particulièrement convaincant.
5 votes
Conseil : si vous peut faire quelque chose, cela ne veut pas dire que vous devrait le faire.
0 votes
Voir aussi stackoverflow.com/a/18176765/1398418 Il n'y a pas de différence entre un constructeur générique et une méthode générique qui ne renvoie rien.
2 votes
Voir javafx.animation.KeyValue . Vous pouvez exiger que plusieurs arguments s'appliquent à des types cohérents.