OVH Cloud OVH Cloud

Héritage multiple des interfaces et surcharge de méthodes

6 réponses
Avatar
Aurélien MOREAU
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les
options de compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK
de sun:

> javac -version IC.java
javac 1.5.0
IC.java:9: types IB and IA are incompatible; both define
op(), but with unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des
compilos ? Il y a-t-il une option pour javac permettant de
compiler un tel code ?

Merci d'avance

6 réponses

Avatar
Kupee
Aurélien MOREAU wrote:
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les options de
compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK de sun:

javac -version IC.java
javac 1.5.0

IC.java:9: types IB and IA are incompatible; both define op(), but with
unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des compilos ? Il y
a-t-il une option pour javac permettant de compiler un tel code ?


Euh le but est difficile a comprendre. IC doit il avoir les 3 méthodes

IC op();

IB op();

IA op();

? Si c'est le but, c'est impossible en java


Avatar
Bruno CAUSSE
dans l'article 43a83338$0$31138$, Kupee à
a écrit le 20/12/05 17:42 :

Aurélien MOREAU wrote:
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les options de
compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK de sun:

javac -version IC.java
javac 1.5.0

IC.java:9: types IB and IA are incompatible; both define op(), but with
unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des compilos ? Il y
a-t-il une option pour javac permettant de compiler un tel code ?


Euh le but est difficile a comprendre. IC doit il avoir les 3 méthodes

IC op();

IB op();

IA op();

? Si c'est le but, c'est impossible en java


Le type de retour ne fait pas parti de la signature de la methode donc 3
signatures identiques == conflit !



Avatar
Aurélien MOREAU
dans l'article 43a83338$0$31138$, Kupee à
a écrit le 20/12/05 17:42 :

Aurélien MOREAU wrote:
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les options de
compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK de sun:

javac -version IC.java
javac 1.5.0

IC.java:9: types IB and IA are incompatible; both define op(), but with
unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des compilos ? Il y
a-t-il une option pour javac permettant de compiler un tel code ?
Euh le but est difficile a comprendre. IC doit il avoir les 3 méthodes


IC op();

IB op();

IA op();

? Si c'est le but, c'est impossible en java
Non, une classe implémentant IC ne devra définir que <<IC


op()>>
L'idée est qu'une classe implémentant IC doit être
manipulable comme une IA ou une IB mais je n'ai pas la main
sur les interface IA, IB (provient d'un autre projet).



Le type de retour ne fait pas parti de la signature de la methode donc 3
signatures identiques == conflit !

Je ne connais pas plus que ca le système de type de Java,

mais je suis d'accord avec vous il devrait avoir conflit
pour ce que j'en connais. Mais théoriquement cette surcharge
est valide au niveau de la variance/contravariance
(Spécialisation et sous-typage : thème et variations, Roland
Ducournau)

De plus, je le répète ce code compile et tourne sous
Eclipse3.1 avec les options définies plus haut.
Je crois par contre que le compilateur d'Eclipse est un
compilateur embarqué spécifique.




Avatar
ekse

dans l'article 43a83338$0$31138$, Kupee à
a écrit le 20/12/05 17:42 :

Aurélien MOREAU wrote:

Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les options de
compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK de sun:

javac -version IC.java


javac 1.5.0
IC.java:9: types IB and IA are incompatible; both define op(), but with
unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des compilos ? Il y
a-t-il une option pour javac permettant de compiler un tel code ?


Euh le but est difficile a comprendre. IC doit il avoir les 3 méthodes

IC op();

IB op();

IA op();

? Si c'est le but, c'est impossible en java



Non, une classe implémentant IC ne devra définir que <<IC op()>>
L'idée est qu'une classe implémentant IC doit être manipulable comme une
IA ou une IB mais je n'ai pas la main sur les interface IA, IB (provient
d'un autre projet).



Le type de retour ne fait pas parti de la signature de la methode donc 3
signatures identiques == conflit !

Je ne connais pas plus que ca le système de type de Java, mais je suis

d'accord avec vous il devrait avoir conflit pour ce que j'en connais.
Mais théoriquement cette surcharge est valide au niveau de la
variance/contravariance (Spécialisation et sous-typage : thème et
variations, Roland Ducournau)

De plus, je le répète ce code compile et tourne sous Eclipse3.1 avec les
options définies plus haut.
Je crois par contre que le compilateur d'Eclipse est un compilateur
embarqué spécifique.


Salut, c'est effectivement très étonnant et pas vraiment naturel. Une
classe qui implémente IC doit définir la méthode IC op() et c'est tout.
Cela s'entends peut-etre comme de la surcharge (en gros l'extend IA et
IB ne sert à rien), mais je ne croyais pas que c'était possible. Tu
devrais poster ton code sur le forum eclipse.





Avatar
Xavier Tarrago
Effectivement, ça devrait compiler puisque java 5.0 accepte les
redéfinitions avec type compatible (covariance je crois).

interface IA { IA op() }

interface IC extends IA { IC op() }

devrait marcher. Alors pourquoi pas avec deux héritages.

Peut-etre une option de compilation du compilo sun?


"Aurélien MOREAU" a écrit dans le message de
news:43a81f69$0$15706$
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les
options de compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK
de sun:

javac -version IC.java
javac 1.5.0

IC.java:9: types IB and IA are incompatible; both define
op(), but with unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des
compilos ? Il y a-t-il une option pour javac permettant de
compiler un tel code ?

Merci d'avance



Avatar
Aurélien MOREAU
Effectivement, ça devrait compiler puisque java 5.0 accepte les
redéfinitions avec type compatible (covariance je crois).

interface IA { IA op() }

interface IC extends IA { IC op() }

devrait marcher. Alors pourquoi pas avec deux héritages.

Peut-etre une option de compilation du compilo sun?


Merci pour cette précision, c'est donc une spécificité de

java 5.0
A partir de là quelques questions:

* Ou trouver les spécification de ce comportement ? Je n'en
trouve pas la trace sur les "New Features and Enhancements"
(http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html)
* Les classes compilées (avec eclipse) ont l'air de
tourner sur une JRE1.4.2_10, c'est donc une spécificité du
compilateur et non du langage ?
* Je ne trouve pas l'option sur javac de la jdk de sun, une
idée ??
* Une redéfinition simple comme proposée plus haut compile
avec la jdk de sun .... comme le montre le message d'erreur,
c'est le conflit de nom sur les méthodes de IA et IB qui
pose problème.

Merci encore

"Aurélien MOREAU" a écrit dans le message de
news:43a81f69$0$15706$
Bonjour,

Voici une simplification d'un problème que je rencontre:

IC.java:

interface IA {
IA op();
}

interface IB {
IB op();
}

public interface IC extends IA, IB{
IC op();
}


J'arrive à compiler un tel code sour Eclipse 3.1 avec les
options de compilation ("Java Compiler") suivantes:

Compiler compliance level: 5.0
Generated .class files compatibility : 1.4
Source compatibility: 1.4


Par contre impossible de le compiler à la main avec la JDK
de sun:

javac -version IC.java
javac 1.5.0

IC.java:9: types IB and IA are incompatible; both define
op(), but with unrelated return types
public interface IC extends IA, IB {
^
1error

Peut-on m'éclairer sur ce problème de comportement des
compilos ? Il y a-t-il une option pour javac permettant de
compiler un tel code ?

Merci d'avance