Odkryłem następujące problemy z rodzajami. Rozważmy interfejs rodzajoweUzyskiwanie dostępu do argumentów typów generycznych używanych w typbundach
public interface A<X> {
X get();
void doStuff(X x);
}
Teraz załóżmy następującą definicję metody:
public <T extends A<?>> void foo(T t) {
bar(t);
}
powodu zamiennika, informacje typu dla typu zwracanej get() jest niewystarczająca. Dlatego muszę przekazać do innego sposobu, który „wiąże” to wieloznaczny do nowego typu zmiennej:
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
Wezwanie bar() w foo nie jest dozwolone, kompilator wyświetla się następujący komunikat o błędzie:
pasek metoda (A) w teście typu nie stosuje się do argumentów (T)
jeśli jednak zmienić foo() metoda do
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
to działa. Czemu? Czy jest to błąd kompilatora? Wszelkie uwagi na ten temat będą bardzo mile widziane.
Uwagi:
- Powodem dlaczego nie po prostu zadeklarować metodę void foo foo jako (A) jest to, że ja rzeczywiście przy górnej typu związanego interesection (&).
- Powodem, dla którego nie deklaruję X jako zmiennej typu w foo(), jest fakt, że faktycznie mam problem na poziomie klasy i nie chcę niepotrzebnie zwiększać liczby parametrów typu tej klasy.
używasz flagi -Xlint kompilator? Jeśli nie, spróbuj skompilować z tym –
Nic nie zmienia. – misberner
Zgadzam się z @kan. Kompilator java faktycznie to kompiluje. Użyłem 1.6.0_27. Eclipse podaje dokładny błąd, który podałeś, więc może go używasz? –