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

a propos des Generics

4 réponses
Avatar
Thomas LEDUC
bonjour,
Après lecture de
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
je ne suis toujours pas capable de déboguer la classe Main ci-après.
Grand merci, d'avance, pour votre aide.

// =====================================================================
public abstract class ADescriptor {
private int value;
public int getValue() { return value; }
public void setValue(int value) { this.value = value; }
public void absMethod() {
System.out.println(getClass().getName() + "::absMethod()");
}
}
// =====================================================================
public class MyDescriptor extends ADescriptor {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}
// =====================================================================
import java.util.ArrayList;
import java.util.List;
public abstract class AGeometry<T extends ADescriptor> {
private List<T> list;
public AGeometry() { list = new ArrayList<T>(); }
public List<T> getList() { return list; }
public void absMethod() {
System.out.println(getClass().getName() + "::absMethod()");
}
}
// =====================================================================
public class MyGeometry<T extends MyDescriptor> extends AGeometry<T> {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}
// =====================================================================
public class Main {
public static void main(String[] args) {
ADescriptor d = new MyDescriptor();
d.setValue(13);

// mon problème commence ici :
AGeometry<ADescriptor> g = new MyGeometry<MyDescriptor>();

// ce qui précède ne compile pas - tout comme les 2 lignes suivantes :
AGeometry<? extends ADescriptor> gg = new MyGeometry<MyDescriptor>();
gg.getList().add(d);
gg.getList().get(0).method();

// ce que je cherche à faire : manipuler, sans connaître a priori son
// implémentation, une structure générique (abstraite) de type
// AGeometry<ADescriptor>
}
}

4 réponses

Avatar
Thomas LEDUC
On Wed, 05 Jul 2006 15:14:40 +0200, Thomas LEDUC wrote:

// ==================================================================== > public class MyGeometry<T extends MyDescriptor> extends AGeometry<T> {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}


en me relisant (tardivement, j'en conviens), je me rends compte que la
classe ci-dessus peut être simplifiée comme suit :

public class MyGeometry extends AGeometry<MyDescriptor> {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}

je ne suis pour autant toujours pas en mesure d'écrire ce qui suit :
AGeometry<ADescriptor> g = new MyGeometry();

et je suis conscient que cela est dû au fait que (page 4 du tutorial de G
Bracha) :
AGeometry<MyDescriptor> n'hérite pas de AGeometry<ADescriptor>
pourtant, parce que je ne connais pas l'implémentation MyDescriptor, c'est
bien un AGeometry<ADescriptor> que je souhaite manipuler.

Enfin, déclarer comme suit ne semble pas convenir non plus (même si cela
compile) :
AGeometry<? extends ADescriptor> gg = new MyGeometry();

Avatar
Ploc
Thomas LEDUC wrote:

// ==================================================================== > public class Main {
public static void main(String[] args) {
ADescriptor d = new MyDescriptor();
d.setValue(13);

// mon problème commence ici :
AGeometry<ADescriptor> g = new MyGeometry<MyDescriptor>();



On peut mettre un MyDescriptor dans un AGeometry<ADescriptor>, mais on
ne peut pas dire qur MyGeometry<MyDescriptor> est un AGeometry<ADescriptor>.
C'est pareil en c++.

Avatar
Ploc
Ploc wrote:
Thomas LEDUC wrote:

// ==================================================================== >> public class Main {
public static void main(String[] args) {
ADescriptor d = new MyDescriptor();
d.setValue(13);

// mon problème commence ici :
AGeometry<ADescriptor> g = new MyGeometry<MyDescriptor>();



On peut mettre un MyDescriptor dans un AGeometry<ADescriptor>, mais on
ne peut pas dire qur MyGeometry<MyDescriptor> est un
AGeometry<ADescriptor>.
C'est pareil en c++.



Voir page 4 du tutorial "Generics and Subtyping", au tout debut.


Avatar
Hervé AGNOUX
Je ne sais pas si c'est toujours d'actualité, mais je pense qu'il y a à la
base une confusion entre le extends des génériques et le extends des
classes.

Peut être pourrais-tu t'inspirer du modèle de déclaration des "enum" :

Class Enum<E extends Enum<E>>

... qui permet une association des deux sens de extends. Tu pourras en
trouver les explications à

"How do I decrypt "Enum<E extends Enum<E>>"?"
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#How%20do%20I%20decrypt%20Enum?

ou à

http://chaoticjava.com/?pC


Thomas LEDUC wrote:

bonjour,
Après lecture de
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
je ne suis toujours pas capable de déboguer la classe Main ci-après.
Grand merci, d'avance, pour votre aide.

// ==================================================================== > public abstract class ADescriptor {
private int value;
public int getValue() { return value; }
public void setValue(int value) { this.value = value; }
public void absMethod() {
System.out.println(getClass().getName() + "::absMethod()");
}
}
// ==================================================================== > public class MyDescriptor extends ADescriptor {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}
// ==================================================================== > import java.util.ArrayList;
import java.util.List;
public abstract class AGeometry<T extends ADescriptor> {
private List<T> list;
public AGeometry() { list = new ArrayList<T>(); }
public List<T> getList() { return list; }
public void absMethod() {
System.out.println(getClass().getName() + "::absMethod()");
}
}
// ==================================================================== > public class MyGeometry<T extends MyDescriptor> extends AGeometry<T> {
public void method() {
System.out.println(getClass().getName() + "::method()");
}
}
// ==================================================================== > public class Main {
public static void main(String[] args) {
ADescriptor d = new MyDescriptor();
d.setValue(13);

// mon problème commence ici :
AGeometry<ADescriptor> g = new MyGeometry<MyDescriptor>();

// ce qui précède ne compile pas - tout comme les 2 lignes suivantes :
AGeometry<? extends ADescriptor> gg = new MyGeometry<MyDescriptor>();
gg.getList().add(d);
gg.getList().get(0).method();

// ce que je cherche à faire : manipuler, sans connaître a priori son
// implémentation, une structure générique (abstraite) de type
// AGeometry<ADescriptor>
}
}


--
Hervé AGNOUX
http://www.diaam-informatique.com