il problema è che si sta utilizzando un tipo crudo su questa linea:
A a;
è necessario specificare un tipo per il parametro di tipo di a (T).
Si potrebbe fare qualcosa di simile:
A<B> a;
ma poi una potrebbe anche non essere generico a tutti, se io sto capendo la sua dichiarazione del problema. Probabilmente si vuole fare qualcosa di simile:
class A<T> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<B<T>> a;
public void event() {
a.fun(this);
}
}
o anche questo:
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);
}
}
Ci sono un paio di variazioni in-tra questi che sono forse utili. L'ultimo esempio è il più generico (ma ovviamente anche il più complicato).
Il class A<T extends B<? extends T>>
è garantire che il parametro di tipo A è una B. Poiché B è generica, e ha quel parametro di tipo ciclico, si finisce per dover dire B<? extends T>
(semplicemente dicendo T non funzionerà qui).
Il class B<T extends B<T>>
è il più vicino possibile a emulare un "self-type" in Java. Ciò consente a B di parlare del sottotipo (quasi) concreto di se stesso. Quando sottoclassi B diresti qualcosa come "class C extends <B<C>>
". Questo è utile perché ora il tipo di C.a
è in realtà A<? super B<C>>
.
Il bit ? super
nell'ultimo esempio è utile solo se si pianifica di collegare una B con uno A
che non è esattamente lo stesso tipo di B
. Pensando in termini concreti, si supponga di avere uno A<Shape>
e uno Circle
(che si estende Shape
che si estende B
). Il super-jolly ti consente di usarli insieme. Senza di esso avresti bisogno di un A<Circle>
anziché di un A<Shape>
per il tuo Circle
.
fonte
2009-08-10 08:50:23
L'unico avviso che riesco a vedere è l'utilizzo di A come tipo non elaborato. Se questo non è l'avvertimento a cui ti stai riferendo, per favore sii più specifico e dicci quale compilatore stai usando. – skaffman