Envoyé par
adiGuba
Non... Tu tombes bien car tu utilises une interface, et que le cast est inutile dans ton cas précis, surtout que tu utilises par la suite C<?> (sans typage fort justement).
Les classes Generics conservent bien les casts à l'exécution, mais ils sont vérifié dès la compilation
a++
Ben oui, il y a un C<?> puisque tout à la fin je mets différentes instances dans un tableau histoire de dire que on peut avoir comme ça des comportements polymorphes super chiadés mais c'est pour l'exemple. Le typage, dans les classes CI1 et CI2, il est fort, voilà !!! Non là vraiment tu chipotes
Bon alors je la refais en plus simpliste:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package p;
public class CC1<T> {
private final T _t;
public CC1(final T t) {
_t = t;
}
public T get() {
return _t;
}
} |
Et le bytecode qui va avec:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // access flags 1
// signature ()TT;
// declaration: T get()
public get()Ljava/lang/Object;
L0
LINENUMBER 12 L0
ALOAD 0
GETFIELD p/CC1._t : Ljava/lang/Object;
ARETURN
L1
LOCALVARIABLE this Lp/CC1; L0 L1 0
// signature Lp/CC1<TT;>;
// declaration: p.CC1<T>
MAXSTACK = 1
MAXLOCALS = 1 |
Bon j'ai juste mis la méthode get() qui est celle qui m'intéresse. Il n'y a pas de cast.
Quelque chose d'équivalent mais sans genercis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package p;
public class CC2 {
private final Object _o;
public CC2(final String s) {
_o = s;
}
public String get() {
return (String)_o;
}
} |
Et le bytecode du get():
1 2 3 4 5 6 7 8 9 10 11 12
| // access flags 1
public get()Ljava/lang/String;
L0
LINENUMBER 12 L0
ALOAD 0
GETFIELD p/CC2._o : Ljava/lang/Object;
CHECKCAST java/lang/String
ARETURN
L1
LOCALVARIABLE this Lp/CC2; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1 |
Dans lequel il y bien un cast.
Et dans tout ça, pas d'interfaces, même pas de borne explicite sur le type paramétré. Et puis je veux bien replacer dans l'exemple précédent l'interface par une classe abstraite mais je pense que le résultat sera le même.
Ton raisonnement est en outre faux
... Donc pas tant que ça en définitive puisque qu'il n'y a effectivement pas de cast. Par ailleurs, ton exemple utilisait une ArrayList donc je l'ai pris comme référence...
Je vais quand même faire mes petites vérifs sur LinkedList parce que le cas que tu mentionnes me surprend.
@+
Partager