Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb surcharge covariante

3 réponses
Avatar
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.

3 réponses

Avatar
Yliur
Xavier Tarrago a écrit :
Bonjour,
Le code suivant compile sous eclipse, mais ne passe pas le compilo sun.
Quelqu'un sait-il si c'est correct ou pas?



? 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)

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



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).


D'ailleurs,

public class IABProvider implements IAProvider, IBProvider {
public IAB get() {return null;}
}

compile sans problème.



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 ?
Avatar
Jack
Yliur a écrit :

? 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)



Eclipse embarque bien son propre compilateur, appelé ecj je crois.


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






En fait, eclipse en mode 1.4 donne une erreur, tandis que eclipse en
mode 1.5 compile bien.


public class IABProvider implements IAProvider, IBProvider {
public IAB get() {return null;}
}

compile sans problème.



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 ?



pareil, ça ne compile pas en 1.4, mais bien en 1.5
Avatar
Xavier Tarrago
Effectivement, je suis en java 1.6. En 1.4, le retour covariant n'est pas
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/view_bug.do?bug_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.