Pb surcharge covariante
Le
Xavier Tarrago
Bonjour,
Le code suivant compile sous eclipse, mais ne passe pas le compilo sun.
Quelqu'un sait-il si c'est correct ou pas?
public interface IA {}
public interface IB {}
public interface IAB extends IA, IB {}
public interface IAProvider {
IA get();
}
public interface IBProvider {
IB get();
}
public interface IABProvider extends IAProvider, IBProvider {
IAB get();
}
IABProvider.java:2: types IBProvider and IAProvider are incompatible; both
define get(), but with unrelated return types
public interface IABProvider extends IAProvider, IBProvider {
^
1 error
Il me semble que grâce à la surcharge cela devrait marcher D'ailleurs,
public class IABProvider implements IAProvider, IBProvider {
public IAB get() {return null;}
}
compile sans problème.
Le code suivant compile sous eclipse, mais ne passe pas le compilo sun.
Quelqu'un sait-il si c'est correct ou pas?
public interface IA {}
public interface IB {}
public interface IAB extends IA, IB {}
public interface IAProvider {
IA get();
}
public interface IBProvider {
IB get();
}
public interface IABProvider extends IAProvider, IBProvider {
IAB get();
}
IABProvider.java:2: types IBProvider and IAProvider are incompatible; both
define get(), but with unrelated return types
public interface IABProvider extends IAProvider, IBProvider {
^
1 error
Il me semble que grâce à la surcharge cela devrait marcher D'ailleurs,
public class IABProvider implements IAProvider, IBProvider {
public IAB get() {return null;}
}
compile sans problème.

Poser une question


? Je ne crois pas qu'Eclipse embarque un compilateur Java. A priori si vous
avez un JDK de Sun sur votre machine, il devrait être utilisé par Eclipse.
J'ai essayé chez moi, Eclipse ne veut pas le compiler non plus (ou plutôt
le compilateur de Sun, dans Eclipse)
Non, les méthodes ne peuvent pas être différenciées uniquement par leur type de
retour.
Pour choisir la méthode à appliquer en cas de surcharge, la JVM se base sur la type
dynamique de l'objet sur lequel la méthode est appelée (c'est-à-dire le type
réel au moment de l'exécution, pas forcément celui qui a été déclaré) et sur le
type statique des paramètres (les types déclarés des variables passées en paramètres
à la méthode).
Je ne peux pas compiler ça non plus.
Etes-vous sûr que vous n'avez pas plusieurs définitions des interfaces et classes à
plusieurs endroits ?
Eclipse embarque bien son propre compilateur, appelé ecj je crois.
En fait, eclipse en mode 1.4 donne une erreur, tandis que eclipse en
mode 1.5 compile bien.
pareil, ça ne compile pas en 1.4, mais bien en 1.5
supporté.
Et je confirme, eclipse a son propre compilo (pour des fonctions de debug je
crois).
Une recherche sur google pointe sur des descriptions de problèmes
similaires. Il semble que ce soit un bug.
voir http://bugs.sun.com/bugdatabase/vie...g_idb94779
Ceci devrait marcher:
interface A { A get();}
interface B {B get()}
interface C extends A,B{C get()}
ainsi que:
interface I1<E> {
List<E> m();
}
interface I2<E> {
Queue<E> m();
}
interface I3<E> {
LinkedList<E> m();
}
interface I4<E> extends I1<E>, I2<E>, I3<E> {}
sachant que LinkedList herite de Queue et de List.
Merci de vos réponses.