Tu bardzo dobry oficjalny tutorial:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
Najważniejsza konkluzja według mnie:
Jeżeli metoda przyjmuje kolekcję "? extends jakasKlasa", to nie może nic do niej dodać(ani jakasKlasa, ani żadnej podklasy).
Mam podobny problem. Jak zapisać poniższy kod, aby kompilował się bez ostrzeżeń(bez @SuppressWarnings("unchecked"))? Chodzi o to, że używam List, zamiast List<?>.
private static enum ListType {
ARRAY_LIST(ArrayList.class),
VECTOR(Vector.class),
COW(CopyOnWriteArrayList.class);
private final Class<? extends List> clazz;
private ListType(final Class<? extends List> clazz) {
this.clazz = clazz;
}
public Class<? extends List> getClazz() {
return clazz;
}
}
Drugie podejście. Używam List<?>, ale nadal na (Class<? extends List<?>>) są ostrzeżenia.
Co ciekawe poniższy kod wbudowany w Eclipsa kompilator kompiluje, a ant już nie (wywala "inconvertible types"). JDK mam najnowsze, w Eclipsie kompatybilność ustawiona na Javę 6.
private static enum ListType {
ARRAY_LIST((Class<? extends List<?>>) ArrayList.class),
VECTOR((Class<? extends List<?>>) Vector.class),
COW((Class<? extends List<?>>) CopyOnWriteArrayList.class);
private final Class<? extends List<?>> clazz;
private ListType(final Class<? extends List<?>> clazz) {
this.clazz = clazz;
}
public Class<? extends List<?>> getClazz() {
return clazz;
}
}