Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1273 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Héritage dans les collections

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Héritage dans les collections

n°1735457
mcyrb
Mieux vaut tard que plus tard
Posté le 22-05-2008 à 00:24:48  profilanswer
 

Bonjour,
 
Est-ce que quelqu'un pourrait m'expliquer pourquoi lorsqu'on a
 

Code :
  1. public interface IA { /*...*/ }
  2. public class A implements IA { /*...*/ }


 
Il est impossible de faire ceci:

Code :
  1. public Collection<IA> m1() {
  2.     return new ArrayList<A>();
  3. }


 
Alors qu'il est tout à fait correct de faire:

Code :
  1. public IA m2() {
  2.     return new A();
  3. }


 
Merci
 

mood
Publicité
Posté le 22-05-2008 à 00:24:48  profilanswer
 

n°1735460
archangel
Un homme Une vision
Posté le 22-05-2008 à 00:52:27  profilanswer
 


 
Imaginons que ton truc marche , et que l'on est ça :
 

Code :
  1. public interface IA { /*...*/ }
  2. public class A implements IA { /*...*/ }
  3. public class B implements IA { /*...*/ }


 
j'utilise ta méthode m1() pour récupérer la collection, mais moi je ne sais pas comment tu l'as codé, j'utilise ta librairie en gros, et donc je fais :

Code :
  1. B b = new B();
  2. Collection<IA> maCollection = toto.m1();
  3. maCollection.add(B);


Et là je me demande ce qui se passerait sachant que toi tu m'as envoyé une ArrayList<A>  :??:  
 


---------------
J'suis timide - Prêt à mourir, mais pas à vivre - Je suis vraiement très fatigué ... - more than meets the eye
n°1735732
Taz
bisounours-codeur
Posté le 22-05-2008 à 15:21:01  profilanswer
 

Une collection de A n'est pas une collection de IA. Après, les generics java et leur bridge, ça fait du gros n'importe quoi, tu peux y coller ce que tu veux dedans, ça dira rien mais quand tu récupèreras, là tu te prendras du cast exception.

n°1735848
mcyrb
Mieux vaut tard que plus tard
Posté le 22-05-2008 à 18:08:25  profilanswer
 

archangel a écrit :


Imaginons que ton truc marche , et que l'on est ça :

 
Code :
  1. public interface IA { /*...*/ }
  2. public class A implements IA { /*...*/ }
  3. public class B implements IA { /*...*/ }
 

j'utilise ta méthode m1() pour récupérer la collection, mais moi je ne sais pas comment tu l'as codé, j'utilise ta librairie en gros, et donc je fais :

Code :
  1. B b = new B();
  2. Collection<IA> maCollection = toto.m1();
  3. maCollection.add(B);


Et là je me demande ce qui se passerait sachant que toi tu m'as envoyé une ArrayList<A>  :??:


Je pensais que maCollection serait considérée une Collection<IA>, meme j'y ai envoyé un ArrayList<A>.
J'imaginais que ça aurait un comportement similaire à

Code :
  1. B b = new B();
  2. Collection<IA> maCollection = new ArrayList<IA>();
  3. for (IA a : toto.m1()) {
  4.     maCollection.add(a);
  5. }
  6. maCollection.add(b);


avec à l'interieur de cette Collection des objets (A ou B) sur lesquels sont applicables les methodes de IA.
Mais si en réalité, ce que renvoie m1() (en admettant qu'elle soit correcte) est implementé quoiqu'il en soit comme un ArrayList<A>, je veux bien admettre qu'on ne puisse pas y mettre autre chose que du A.

 
Taz a écrit :

Une collection de A n'est pas une collection de IA. Après, les generics java et leur bridge, ça fait du gros n'importe quoi, tu peux y coller ce que tu veux dedans, ça dira rien mais quand tu récupèreras, là tu te prendras du cast exception.


Si A "est un" IA, je ne vois pas pourquoi un ensemble de A ne pourrait pas être un ensemble de IA. Moi au final je m'en fous de ce qu'il y a dans la collection, du moment ou ça implémente IA (et donc que je peux y appliquer ses méthodes). Je veux bien comprendre que d'un point de vue technique ça pose quelques problemes, mais d'un point de vue purement conceptuel, je trouve que c'est un peu gênant qu'on ne puisse pas le faire.

 


Je pense que j'ai saisi le fond du probleme, merci pour vos réponses.

Message cité 1 fois
Message édité par mcyrb le 22-05-2008 à 18:08:59
n°1736109
Taz
bisounours-codeur
Posté le 23-05-2008 à 11:07:22  profilanswer
 

mcyrb a écrit :


[quotemsg=1735848,4,64110]
Si A "est un" IA, je ne vois pas pourquoi un ensemble de A ne pourrait pas être un ensemble de IA. Moi au final je m'en fous de ce qu'il y a dans la collection, du moment ou ça implémente IA (et donc que je peux y appliquer ses méthodes). Je veux bien comprendre que d'un point de vue technique ça pose quelques problemes, mais d'un point de vue purement conceptuel, je trouve que c'est un peu gênant qu'on ne puisse pas le faire.
 
 
Je pense que j'ai saisi le fond du probleme, merci pour vos réponses.


 
 
Utile java.util.copy.
 
 
Ce que tu dis c'est faux: si coll<A> est une col<IA> alors tu devrais pouvoir insérer dedans tout IA. Mais ce n'est pas le cas parce que tout IA n'est pas un A.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Héritage dans les collections

 

Sujets relatifs
Recastage et héritage avec une ListHeritage: virtual / static probleme de design
question sur l'héritage multiplehéritage multiple .. pour ou contre ?
[Javascript] héritage entre classe dans des fichiers différentsquestion héritage CSS
Hashtable de collections, pb de conception ?petite question sur l'héritage et les cast
question de débutant, casts & héritage[MySQL] Héritage ?
Plus de sujets relatifs à : Héritage dans les collections


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR