Héritage dans les collections

Héritage dans les collections - Java - Programmation

Marsh Posté le 22-05-2008 à 00:24:48    

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
 

Reply

Marsh Posté le 22-05-2008 à 00:24:48   

Reply

Marsh Posté le 22-05-2008 à 00:52:27    


 
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
Reply

Marsh Posté le 22-05-2008 à 15:21:01    

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.

Reply

Marsh Posté le 22-05-2008 à 18:08:25    

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
Reply

Marsh Posté le 23-05-2008 à 11:07:22    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed