Question sur la hiérarchie des interfaces

Résolu/Fermé
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 - 4 mars 2015 à 19:10
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 - 5 mars 2015 à 13:34
Bonjour, et merci à ce qui me répondront.
J'ai une question comme le dit le titre.
Les interfaces sont les super types de leur classe fille, mais sont elles aussi des super types des classes qui les implémentent?
Merci et bonne journée, soirée...

6 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 mars 2015 à 19:49
Bonjour,

Ta question est assez confuse, comme je la comprends je dirais que oui, mais je ne suis pas certain qu'on parle de la même chose.

La notion de "super type" que tu décris (ce terme n'existe pas) devrait correspondre à l'égalité que l'on obtient avec méthode isAssignableFrom :

public class Test {
    
    public static void check(Class<?> class1, Class<?> class2) {
        boolean assignable = class1.isAssignableFrom(class2);
        System.out.println(class1.getSimpleName()+" x = y; is "+(assignable ? "valid" : "invalid") + " when y is a "+class2.getSimpleName());
    }
    
    public static void main(String[] args) {
        // Object x = y; is valid when y is a String
        check(Object.class, String.class); 
        // String x = y; is invalid when y is a Object
        check(String.class, Object.class); 
    }
}

"Les interfaces sont les super types de leur classe fille"
interface I {}
interface J extends I {}

check(I.class, J.class); // I x = y; is valid when y is a J

"Les interfaces (...) sont elles aussi des super types des classes qui les implémentent?"
interface I {}
class C implements I {}

check(I.class, C.class); // I x = y; is valid when y is a C
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
Modifié par Skymer le 4/03/2015 à 21:13
Bonsoir, oui je me suis tromper dans ma question, la question est que si on à un Interface I, une Classe A implémentant cette Interface I (avec quelques méthodes pour mieux m'expliquer) :
Interface I{
 public void A(){
 //Code...
 }
 public String int(){
 //Code...
 }
}
public class A implements I{
 public void A(){
 //Code..., redéfinissions de la méthode de l'interface I
 }
 public String int(){
 //Code..., redéfinissions de la méthode de l'interface I
 }
}

Le type pour l'instanciation de l'objet A =
A a = new A();

Le super type pour l'instanciation de A =
I a = new A();


Dis moi si les deux façons sont possible, étant que l'on peux instancier l'objet A avec son propre type (le type A) et son super type (l'interface I). Si oui je me suis compris ^^. Merci et pour la notion de supertype, j'ai acheté le livre de Cyrille Herby issu du site du zéro (maintenant OpenClassRoom), je cite :
"-Une interface sert à définir un supertype et à utiliser le polymorphisme"
Skymer
"On à jamais rien, sans rien !"
"Ne jamais abandonnez"
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 mars 2015 à 21:14
Tu peux tester avec la méthode isAssignableFrom comme je l'ai fait tout à l'heure.

A a = new A(); // check(A.class, A.class); // A x = y; is valid when y is a A
I a = new A(); // check(I.class, A.class); // I x = y; is valid when y is a A
A a = new I(); // check(A.class, I.class); // A x = y; is invalid when y is a I

Remarque : j'ai bien mis que le dernier est invalid, d'une part new I() n'a pas de sens car I est une interface et que new est un constructeur d'objet (il s'applique donc à une classe), d'autre part il n'y a rien qui lie I avec A, la relation se fait dans un seul sens (A est un I, mais I n'est pas forcément un A).

En revanche si tu es sûr que ton objet I est un A (car il peut l'être) tu peux le forcer mais il faut faire un cast explicite.

I a = new A();
A b = (A) a;
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
Modifié par Skymer le 4/03/2015 à 21:21
Je m'éclairci merci, donc I est un supertype de A ? Pourtant tu me dis que la notion de supertype n'existe pas. Il y a un problème là. Je me suis peut-être mal exprimés?

Skymer
"On à jamais rien, sans rien !"
"Ne jamais abandonnez"
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 mars 2015 à 21:29
"Pourtant tu me dis que la notion de supertype existe"
J'ai dit que "ce terme n'existe", je n'ai jamais entendu parlé de "supertype" ça ne veut rien dire. Par contre la notion existe bien sûr, c'est de l'héritage multiple.
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
Modifié par Skymer le 4/03/2015 à 21:45
Oui je me suis trompé, j'avais déjà corrigé ça regarde : "Pourtant tu me dis que la notion de supertype n'existe pas". Pour le problème j'ai compris.
Dans le livre du site du zéro il me parle de supertype : soit faut que tu fasses une mise à jour de tes connaissances : https://www.google.fr/?gws_rd=ssl#q=Supertype+java, soit il y a une grosse erreur sur le net est dans mon livre, sachant que Cyrille Herby c'est pas n'importe qui, ne prend pas ça mal. Je ne résolu pas pour l'instant le topic, pour voir ta réponse sur la notion du supertype, peut-être je t'ai appris quelque chose ce qui m'étonnerais, sachant que vu qu'on c'est croisé plusieurs fois sur le site, et tes nombreuses réponses j'en ai déduis que tu étais (si je peux me permettre) un pro en java. Comprends tu si je te dis que I est un type de A? <== c'est mieux ?


Skymer
"On à jamais rien, sans rien !"
"Ne jamais abandonnez"
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
4 mars 2015 à 21:46
Si tu veux une photo pour preuve de ce qu'il y a écrit dans ma bible c'est comme tu veux.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
4 mars 2015 à 22:37
"Comprends tu si je te dis que I est un type de A? <== c'est mieux ? "
Ce n'est pas à moi de comprendre, moi je sais ce qu'il en est.

Et non, ce n'est pas mieux (ni pire, je ne fais pas un classement...)
On peut dire que I est un type, que A est un type, mais il n'y a pas de hiérarchie entre les types. Le type c'est ce qui définit une variable. On peut avoir un type primitif (int, double, char, etc.) on peut avoir des classes ou des interfaces comme type.
Mais il n'y a pas de hiérarchie dans les types. Par contre il y a des relations d'héritage entre les classes et les interfaces. On peut dire que A implémente I, mais il n'y a pas de raison de dire que I est un type de A, de même qu'on peut dire que String hérite de Object mais pas que Object est un type de String.

Mais ce serait dommage de rentrer dans une guerre de lexique. Je ne me bats pas contre Cyrille Herby, je ne le connais pas, je n'ai jamais lu son tutoriel (même si je le connais de réputation puisque bon nombre de questions sur le forum consiste à lui trouver une alternative), mais puisque tu as une question, j'essaye d'y répondre de la manière la plus concrète possible.
Et il me semble que la méthode isAssignableFrom est la meilleure réponse qu'on puisse te donner. Elle permet de vérifier si pour deux types X et Y on peut faire l'affectation x = y (avec x de type X et y de type Y), ce qui n'est possible que si Y = X, Y extends X, ou Y implements X (ou bien sûr par récursivité Y extends Z avec Z extends X ; Y extends Z avec Z implements X ; Y implements Z avec Z extends X ; etc.)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
5 mars 2015 à 11:10
Quand je t'ai dis "Comprends tu si je te dis que I est un type de A? <== c'est mieux ? ", je voulais te demander si tu étais d'accord avec moi.
Alors pour la hiérarchie des types je vais chercher.
Regarde ça s'il te plait : "Un supertype est un type d'une superclasse. Autrement dit, c'est un type de la classe dont on hérite, et au delà."
class A {
...
}
 
class B extends A {
... // le type A est un supertype du type B. Le type B est un sous type du type A.
}
 
class C extends B {
... // les types A et B sont des supertypes du type C. Le type C est un sous type des types A et B.
}

Et pour la méthode isAsignableFrom, mon but est de comprendre la notion que tu ne connais pas. Le supertype existe mais pas la hiérarchie entre les types, ce qui est impossible, si le supertype existe il doit y avoir une hiérarchie, non ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 mars 2015 à 12:02
class B extends A {
... // le type A est un supertype du type B. Le type B est un sous type du type A.
}

A et B ne sont pas des types, ce sont des classes (programmation objet), les types sont portés uniquement par des variables (programmation impérative).

Puisque B extends A on peut avoir :
B y = new B(); // y est un objet de la classe B
A x = y; // x est une variable de type A

Quelles différences cela fait ? Dans le code on ne peut utiliser que les méthodes du type de A, alors même que l'objet y peut théoriquement de méthodes supplémentaires spécifiques à la classe B.
C'est encore plus flagrant quand on prend une interface comme type, dans ce cas la variable ne peut être manipulée que pas les quelques méthodes de l'interface.

Il faut donc bien distinguer les notions de types, de classes et d'interfaces, c'est pour ça que je ne suis pas d'accord pour parler de "super-type". Dans ton cas "class B extends A" on pourra parler de super-classe, aucun problème là dessus,et avec "class C extends B", A sera une super classe de C aussi.
0
Skymer Messages postés 477 Date d'inscription vendredi 6 décembre 2013 Statut Membre Dernière intervention 1 novembre 2018 75
5 mars 2015 à 13:34
Ok, merci à toi...
0