2014-09-09 6 views
0

Je suis nouveau à Generics en Java. J'ai quelques doutes sur les avantages de l'utilisation des génériques. S'il vous plaît se référer le code ci-dessous -Quels sont les avantages d'utiliser Generics?

<T extends Bounceable> void goGreen(T ob); 

void goGreen(Bounceable ob); 

Ici Bounceable est une interface. Est-ce que quelqu'un peut m'expliquer quelle est la différence entre les définitions ci-dessus? Ils empêchent tous deux l'appelant de lui passer un objet qui n'est pas de type Bounceable. S'il est possible d'implémenter le même code dans un style d'interface, quel est l'avantage d'utiliser Generics? Merci d'avance.

+0

Bonne question. Je ne connais pas les avantages en utilisant la première notation. – AndreDuarte

+1

Juste parce que vous pouvez utiliser des génériques, ne signifie pas que vous devriez dans tous les cas. Les génériques peuvent être surutilisés comme n'importe quelle fonction. –

Répondre

6

Si vous ne retournez rien comme dans votre exemple, vous n'avez rien gagné en utilisant des génériques. L'autre déclaration est tout aussi utile.

D'autre part, les génériques vous permettent de créer la méthode suivante:

<T extends Bounceable> T goGreen(T ob); 

Ce retourne un objet du même type que vous passez, qui, dans un grand nombre de scénarios que vous enregistrez un casting.
Pour citer l'excellent exemple de LuiggiMendoza dans les commentaires:
Supposons que vous ayez Ball implements Bounceable et Cellphone implements Bounceable. Lorsque vous passez un Ball à cette méthode, vous attendez la méthode pour renvoyer un Ball, pas un Cellphone.

Ceci n'est simplement pas possible avec l'approche non générique.

+0

Qu'en est-il de 'Bounecable goGreen (Bounceable ob)'? –

+0

C'est le seul avantage? Ou il y a autre chose? – AndreDuarte

+6

@VinceEmigh ce n'est pas la même chose. La méthode signifie que vous passerez et recevrez une instance de la classe 'T'. Supposons que vous avez 'Ball implements Bounceable' et' Cellphone implements Bounceable'. Lorsque vous passez un 'Ball' à cette méthode, vous attendez que la méthode renvoie une' Ball', pas un 'Cellphone'. –

0

Et si vous vouliez que le type retourné soit le même?

class Ball implements Bounceable{ 
    void throw(Object target){ 
     //impl 
    } 
} 

Bounceable goGreen(Bounceable ob);//returns a Bounceable back. no throw method 

<T extends Bounceable> T goGreen(T ob);//returns a ball back when called with ball. I can throw it! 

Et si vous vouliez restreindre les types dans l'autre sens?

<T super Bounceable> void setBounceableParent(T ob);//not possible with just polymorphism 

Et si vous vouliez une classe qui a fonctionné sur un type quelconque?

class Holder<T>{ 
    T data; 
    void put(T newData){ 
     data=newData; 
    } 
    T get(){//how do you make this type safe without generics or duck typing? 
     return data; 
    } 
} 
Questions connexes