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;}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ?
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 ?
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 ?
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
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
? 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
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()}
sachant que LinkedList herite de Queue et de List.
Merci de vos réponses.
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()}
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()}