le problème est que vous utilisez un type brut sur cette ligne:
A a;
vous devez spécifier un type pour le paramètre de type de a (T).
Vous pourriez faire quelque chose comme ceci:
A<B> a;
mais A pourrait aussi bien ne pas être générique du tout, si je comprends bien votre énoncé du problème. Vous voulez sans doute faire quelque chose comme ceci:
class A<T> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<B<T>> a;
public void event() {
a.fun(this);
}
}
ou même ceci:
class A<T extends B<? extends T>> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<? super B<T>> a;
public void event() {
a.fun(this);
}
}
Il y a quelques variations dans-entre ceux-ci qui sont peut-être utiles. Le dernier exemple est le plus générique (mais évidemment aussi le plus compliqué). Le class A<T extends B<? extends T>>
fait en sorte que le paramètre de type à A soit un B. Puisque B est lui-même générique, et a ce paramètre de type cyclique, vous finissez par avoir besoin de dire B<? extends T>
(en disant simplement que T ne fonctionnera pas ici).
Le class B<T extends B<T>>
est le plus proche possible de l'émulation d'un "type self" en Java. Cela permet à B de parler du sous-type (presque) concret de lui-même. En sous-classant B, vous diriez quelque chose comme "class C extends <B<C>>
". Ceci est utile parce que maintenant le type de C.a
est réellement A<? super B<C>>
.
Le bit ? super
dans le dernier exemple n'est utile que si vous envisagez de connecter un B avec un A
qui ne correspond pas exactement au même type de B
. Penser en termes concrets, supposons que vous avez eu un A<Shape>
et un Circle
(qui s'étend Shape
qui s'étend B
). Le super-caractère générique vous permet de les utiliser ensemble. Sans cela, vous aurez besoin d'un A<Circle>
plutôt qu'un A<Shape>
pour votre Circle
.
Le seul avertissement que je peux voir est l'utilisation de A comme un type brut. Si ce n'est pas l'avertissement dont vous parlez, veuillez être plus précis, et dites-nous quel compilateur vous utilisez. – skaffman