problemem jest to, że używasz typ surowca na tej linii:
A a;
musisz określić typ parametru typ a jest (T).
Można zrobić coś takiego:
A<B> a;
ale wówczas A może równie dobrze nie być rodzajowy w ogóle, jeśli mam zrozumienia swoje oświadczenie problemu. Prawdopodobnie chcesz zrobić coś takiego:
class A<T> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<B<T>> a;
public void event() {
a.fun(this);
}
}
lub nawet poniżej:
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);
}
}
Istnieje kilka odmian w między te, które są ewentualnie przydatna również. Ten ostatni przykład jest najbardziej ogólny (ale oczywiście także najbardziej skomplikowany).
class A<T extends B<? extends T>>
jest zapewnienie, że parametr typu do A to B. Ponieważ B jest sama rodzajowe i ma cykliczny że parametr typu skończyć się konieczności powiedzieć B<? extends T>
(po prostu mówiąc T nie będzie działać tutaj).
The class B<T extends B<T>>
jest tak blisko, jak można emulować "self type" w Javie. To pozwala B mówić o (prawie) konkretnym podtypie samego siebie. Podklasując B powiesz coś w stylu "class C extends <B<C>>
". Jest to przydatne, ponieważ teraz typ C.a
jest w rzeczywistości A<? super B<C>>
.
Bit w tym ostatnim przykładzie jest użyteczny tylko wtedy, gdy planujesz połączenie B z A
, który nie jest dokładnie tego samego typu, co B
. Myśląc konkretnie, załóżmy, że masz A<Shape>
i Circle
(który rozszerza Shape
, który rozszerza B
). Super-wildcard pozwala używać ich razem. Bez niego potrzebowałbyś A<Circle>
, a nie A<Shape>
dla swojego Circle
.
Jedyne ostrzeżenie jakie widzę to użycie A jako surowca. Jeśli nie jest to ostrzeżenie, do którego odnosisz się, podaj dokładniej i powiedz nam, jakiego kompilatora używasz. – skaffman