generics : round two

generics : round two - Java - Programmation

Marsh Posté le 24-01-2005 à 18:15:09    

Allez, ma petite boulette de generics de la semaine :D
 
Voilà mon code (tout bête) :

Code :
  1. // classe abstraite avec une méthode abstraite paramétrée par le type T
  2. public abstract class plopAbstraite {
  3.     public abstract <T> void affiche(T t);
  4. }
  5. // classe qui hérite de la classe abstraite ci-dessus
  6. public class plop extends plopAbstraite {
  7.     // implémentation de la méthode abstraite : j'y arrive po :(
  8.     public <Integer> void affiche(Integer t) {
  9.         // Erreur rendue par eclipse : The method intValue() is undefined for the type Integer
  10.         int i=t.intValue();
  11.     }
  12.     // une méthode toute bête pour vérifier que Integer a bien une méthode intValue()
  13.     public void affiche2(Integer t) {
  14.         int i2=t.intValue();
  15.     }
  16. }


 
Et eclipse me balance l'erreur indiquée.
Avec javac c'est pareil :


$javac TestGenerics.java
TestGenerics.java:47: cannot find symbol
symbol  : method intValue()
location: class java.lang.Object
        int i=t.intValue();
               ^
1 error


Le truc c'est que si je vire le <Integer>, il me dit que j'ai oublié d'implémenter la méthode abstraite :/
 
Dîtes-moi ce que j'ai oublié !


---------------
get amaroK plugin
Reply

Marsh Posté le 24-01-2005 à 18:15:09   

Reply

Marsh Posté le 24-01-2005 à 18:23:31    

à mon avis, quand tu écris public <Integer> void affiche(Integer t) { il prend Integer comme le nom d'un type générique, pas java.util.Integer comme tu le penses ... => il connait pas la méthode intValue()
 
T'as le droit d'hériter d'une classe en spécifiant le type d'une méthode générique ? ca me semble suspect ...


Message édité par benou le 24-01-2005 à 18:23:53

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-01-2005 à 18:37:36    

benou > +1
 
Les valeurs des variables de types pour les méthodes template sont inférés du contexte, comme en C++. (relis ça lentement)
 
edit : du contexte d'appel.


Message édité par nraynaud le 24-01-2005 à 18:38:14
Reply

Marsh Posté le 25-01-2005 à 08:48:58    

Ha d'accord :)
pigé pour la différence paramétrage de type et paramétrage de méthode !
 

Citation :

T'as le droit d'hériter d'une classe en spécifiant le type d'une méthode générique ? ca me semble suspect ...


 
Ha bon ?
Remarque, en y réfléchissant à deux fois, c'est vrai que c'est bizarre mon truc ...
 
En tout cas merci pour cet éclaircissement :)


---------------
get amaroK plugin
Reply

Marsh Posté le 25-01-2005 à 09:13:06    

bobuse a écrit :


Citation :

T'as le droit d'hériter d'une classe en spécifiant le type d'une méthode générique ? ca me semble suspect ...


 
Ha bon ?
Remarque, en y réfléchissant à deux fois, c'est vrai que c'est bizarre mon truc ...


Il me semble qu'effectivement Java ne gère pas l'équivalent des "Partial Template Specialization" de C++ (AMHA, c'est parce que toute méthode doit être dans une classe, et qui si on se mets à gerer les héritages partiels, on n'est pas sorti de l'auberge). Et toujours AMHA, c'est pas plus mal...
 
Quelqu'un peut confirmer/infirmer ?

Reply

Marsh Posté le 25-01-2005 à 09:14:54    

Je confirme.
 
C'est la méthode qui est générique, et c'est à son appel qu'on la paramètre, pas en la sous-classant.


---------------
JE JE SUIS LIBERTINEEEEEEEEEEE JE SUIS UNE CATINNNNNNNNN §§§§§§§§
Reply

Marsh Posté le 25-01-2005 à 15:53:25    

je squatte le topic, pour voir si qqun pourrait m'expliquer la difference entre
Collections.emptyList()
et  
Collections.EMPTY_LIST
... le 2e devrait me sortir un warning pê ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-01-2005 à 15:56:14    

-- > oui.
 
au moment de l'appel de emptyList(), le type paramètre de la fonction est inféré correctement.

Reply

Marsh Posté le 25-01-2005 à 15:56:46    

the real moins moins a écrit :

je squatte le topic, pour voir si qqun pourrait m'expliquer la difference entre
Collections.emptyList()
et  
Collections.EMPTY_LIST
... le 2e devrait me sortir un warning pê ?


ben...

Citation :

Implementation note: Implementations of this method need not create a separate List object for each call. Using this method is likely to have comparable cost to using the like-named field. (Unlike this method, the field does not provide type safety.)

Reply

Marsh Posté le 25-01-2005 à 15:58:45    

R3g > oué, à tous les coups ils renvoient EMPTY_LIST dans la fonction, mais c'est eux qui se sont pris le warning à la compilation du JDK [:petrus75]

Reply

Marsh Posté le 25-01-2005 à 15:58:45   

Reply

Marsh Posté le 25-01-2005 à 15:58:58    

r3g: la partie interessante de la javadoc, c'était juste au dessus.
et c'est que je vois pas bien en quoi la type-safetiness pourrait apporter quoi que ce soit puisque la liste est vide.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-01-2005 à 15:59:14    

nraynaud a écrit :

R3g > oué, à tous les coups ils renvoient EMPTY_LIST dans la fonction, mais c'est eux qui se sont pris le warning à la compilation du JDK [:petrus75]


tout à fait, castée.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-01-2005 à 16:04:01    

-- > le but des Generics, c'est de supprimer tous les casts et les convertions douteuses. Hors passer du raw type (List) au type paramétré (List<String> ) n'est statiquement pas safe.

Reply

Marsh Posté le 25-01-2005 à 16:05:02    

the real moins moins a écrit :

r3g: la partie interessante de la javadoc, c'était juste au dessus.
et c'est que je vois pas bien en quoi la type-safetiness pourrait apporter quoi que ce soit puisque la liste est vide.


Oui ça apporte pas grand chose, pour moi c'est une queztion de sémantique ; EMPTY_LIST est une List, emptyList renvoie une List<T>, c'est pas pareil c'est tout.

Reply

Marsh Posté le 25-01-2005 à 16:05:49    

mouaif, en fait je soupçonne que c'est parce qu'ils ont pas genericés EmptyList:


private static class EmptyList
 extends AbstractList<Object>


non ?
 
si c'était <T> sur extends AbstractList ça roulerait non? :heink:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-01-2005 à 16:08:36    

-- > non, ça serait plus compatible avec l'ancien code.

Reply

Sujets relatifs:

Leave a Replay

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