Je suis étudiant Head First Java, mais je ne peux pas comprendre la page 544

voix
0

« Lorsque vous déclarez un paramètre de type pour la classe, vous pouvez simplement utiliser ce type ne importe quel endroit que vous souhaitez utiliser une vraie classe ou le type d'interface. Le type déclaré dans l'argument de la méthode est essentiellement remplacé par le type que vous utilisez lorsque vous instancier les classe.

Si la classe elle-même ne pas utiliser un paramètre de type, vous pouvez spécifier un pour une méthode, en déclarant dans un très inhabituel (mais disponible) espace avant le type de retour, cette méthode indique que T peut être « tout type de Animal.

Peux-tu expliquer?

Créé 27/08/2009 à 01:24
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
7

Ce que cela signifie est que dans une classe générique, vous pouvez écrire des méthodes comme ceci:

public T doSomething () {
}

Notez que le type de retour est « T ».

Au moment de la compilation, le type de retour de cette méthode sera tout ce que vous avez passé à la classe générique lorsque vous instancié.

Créé 27/08/2009 à 01:28
source utilisateur

voix
1

Pour le premier paragraphe, c'est à quel point les médicaments génériques travaillent pour les classes. Par exemple, pour la liste, vous pouvez créer une liste d'un type générique, comme nombre entier, par exemple:

ArrayList<Integer> list = new ArrayList<Integer>();

(en code réel , vous utiliseriez List<Integer>bien sûr)

Maintenant ArrayList sera défini comme suit:

public class Arraylist<T> { // implements....

    // ...

    public T get(int index) {
         // ...
    }
}

Ce qui est ce qui permet d'utiliser la getméthode sur listet obtenir un Integer(parce que nous avons fait une classe de type ArrayList<Integer>donc T = Integer). Sinon , le compilateur aurait aucune idée de quels types d'objets de la liste stockait et vous auriez à obtenir la méthode pour retourner un Object, ce qui est la façon dont il était .

Ce que le second moyen de paragraphe est que vous pouvez ajouter des paramètres de type à des méthodes tout comme vous pouvez les classes. par exemple:

public <T> void noOp(T element) {
    // code here
}

Cela vous permettra, par exemple, de créer une méthode utilitaire statique qui retourne quelque chose de type T. Pour revenir le premier élément d'une liste de T de:

public static <T> T getFirst (List<T> list) {
    return list.get(0);
}

Et vous pouvez utiliser cette méthode d'une manière fortement typé. Suggestions pour de meilleurs exemples sont les bienvenus. :-)

edit: je viens de réaliser que j'ai écrit quelque chose qui utilise cette fonctionnalité. J'utilisais l'API JPA et obtenir vraiment ennuyé à toutes les fois où vous devez retourner quelque chose (une liste ou un seul élément) à partir d'une requête, et en cours d'exécution dans les avertissements de type non vérifiées car il n'y a aucun moyen de déduire le type ici. Si vous êtes comme moi et en essayant d'éviter les avertissements dans votre code, vous auriez à supprimer les avertissements à chaque fois. J'ai donc écrit cette méthode pour supprimer les mises en garde pour moi:

@SuppressWarnings("unchecked")
public static <T> List<T> returnResultList(Query query) {
    return (List<T>)query.getResultList();
}

Ce qui par la magie de l'inférence de type fonctionne sur:

List<Integer> list = returnResultList(query);
Créé 27/08/2009 à 13:02
source utilisateur

voix
1
class Zoo<T> {
   static void putAnimal(T animal) {
       // do stuff
   }
}

Zoo<Ape> apeZoo = new Zoo<Ape>(); // you can now put apes (and chimps) here
Zoo<Reptile> monkeyZoo = new Zoo<Reptile>(); // this zoo takes reptiles

apeZoo.putAnimal(new Chimp());
monkeyZoo.putAnimal(new Tortoise());
Créé 27/08/2009 à 02:10
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more