Comme les messages d'autres l'ont noté, vous avez une question sur une fonctionnalité appelée génériques. En C++, cela s'appelle des modèles. La Java bestioles sont beaucoup plus docile à traiter.
Permettez-moi de répondre à vos questions fonctionnellement (si ce n'est pas un vilain mot pour OO discussions).
Avant de génériques, vous avez eu la bonne vieille classes concrètes comme Vecteur.
Vector V = new Vector();
Vecteurs de tenir tout objet ancien que vous leur donnez.
V.add("This is an element");
V.add(new Integer(2));
v.add(new Hashtable());
Cependant, ils le font en jetant tout ce que vous donner à un Objet (la racine de toutes les classes Java). C'est OK jusqu'à ce que vous essayez de récupérer les valeurs stockées dans le Vecteur. Lorsque vous le faites, vous avez besoin de convertir la valeur de retour dans la classe d'origine (si vous voulez faire quelque chose de significatif avec elle).
String s = (String) v.get(0);
Integer i = (Integer) v.get(1);
Hashtable h = (Hashtable) v.get(2);
Casting devient très vite ennuyant. De plus, le compilateur couine à vous sur décoché jette. Pour un exemple frappant de cela, utiliser le XML-RPC bibliothèque d'Apache (version 2 de toute façon). Le problème le plus important est que les consommateurs de votre Vecteur d'avoir à connaître précisément la classe de ses valeurs au moment de la compilation, pour exprimer correctement. Dans les cas où le producteur du Vecteur et de la consommation sont complètement isolés les uns des autres, ce peut être une issue fatale.
Entrée des génériques. Les génériques de tenter de créer des classes fortement typées pour générique opérations.
ArrayList<String> aList = new ArrayList<String>();
aList.add("One");
String element = aList.get(0); // no cast needed
System.out.println("Got one: " + element);
Maintenant, si vous jetez un oeil à la tristement célèbre gang de quatre Modèles de Conception de livre, vous verrez qu'il y a une certaine sagesse dans le divorce des variables à partir de leur mise en œuvre en classe. Il est préférable de penser à des contrats plutôt que la mise en œuvre. Donc, on pourrait dire que tous les objets de la Liste faire les mêmes choses: add()
, get()
, size()
, etc. Cependant, il existe de nombreuses implémentations de la Liste des opérations susceptibles de choisir d'obéir au contrat de diverses manières (par exemple, ArrayList
). Cependant, le type de données de ces objets est à gauche que l'exécution de la considération pour vous, l'utilisateur de la classe générique. Mettez tout cela ensemble et vous verrez la ligne suivante de code très souvent:
List<String> L = new ArrayList<String>();
Vous devriez lire que "L est une sorte de Liste qui traite les objets String". Lorsque vous commencez à traiter avec les classes de Fabrique, il est essentiel de traiter avec des contrats plutôt que des implémentations spécifiques. Les usines produisent des objets de différents types à l'exécution.
L'utilisation de génériques est assez facile (la plupart du temps). Cependant, un jour terrible, vous pouvez décider vous souhaitez mettre en place une classe générique. Peut-être que vous avez pensé à une nouvelle Liste mise en œuvre. Lorsque vous définissez cette catégorie, vous utilisez <t>
comme un espace réservé pour le genre d'objet qui sera manipulé par les méthodes. Si vous êtes confus, utilisez les classes génériques pour la Liste jusqu'à ce que vous sentez à l'aise. Ensuite, vous pouvez plonger dans la mise en œuvre avec un peu plus de confiance. Ou vous pouvez regarder le code source pour les divers Liste des classes qui sont fournies avec le JRE. L'Open source est grande de cette façon.
Jetez un oeil à l'Oracle/Sun docs sur les génériques.
Des acclamations.