Question sur la hiérarchie des interfaces
Résolu
Skymer
Messages postés
477
Date d'inscription
Statut
Membre
Dernière intervention
-
Skymer Messages postés 477 Date d'inscription Statut Membre Dernière intervention -
Skymer Messages postés 477 Date d'inscription Statut Membre Dernière intervention -
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...
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...
A voir également:
- Question sur la hiérarchie des interfaces
- Dans un logiciel de traitement de texte, à quoi sert l'organisation des styles sous forme d'une hiérarchie et le processus d'héritage entre les différents niveaux de cette hiérarchie ? - Guide
- Interface superposée des performances ✓ - Forum Matériel & Système
- Comment avoir l'interface iphone sur android - Télécharger - Guide Android
- Vi /etc/network/interfaces ✓ - Forum Debian
6 réponses
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 :
"Les interfaces sont les super types de leur classe fille"
"Les interfaces (...) sont elles aussi des super types des classes qui les implémentent?"
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
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) :
Le type pour l'instanciation de l'objet A =
Le super type pour l'instanciation de 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"
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"
Tu peux tester avec la méthode isAssignableFrom comme je l'ai fait tout à l'heure.
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.
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;
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"
Skymer
"On à jamais rien, sans rien !"
"Ne jamais abandonnez"
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"
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"
"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.)
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.)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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à."
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 ?
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 ?
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.