klasa Class<T>

0

Kompilator zgłaszał mi błąd, gdy do kolekcji
Map<Class<Annotation>, Class<Creator>>
wstawiałem:
put.(MyAnnotation.class, MyCreator.class);

Dopiero gdy zmieniłem kolekcję na:
Map<Class<? extends Annotation>, Class<? extends Creator>>
klasa się kompilowała i wszystko łądnie działało.

Wydawawało mi się, że rozumiem koncepcję generics, czytałem o windcards. Rozumiem wszystkie przykłady z tutoriali, ale tego nie rozumiem.
Może mi ktoś wytłumaczyć dlaczego kompilator zgłaszał błąd?

0

O ile pamiętam, a niebardzo przykładałem do tego wagi gdy to czytałem. ale w javowym tutorialu o genericsach jest napisane o tym...
Jeśli chcesz móc przypisać jakąś generyczną rozszerzająca/implementującą Twoją generyczną, to musisz zdefiniować typ jako <? extends jakasKlasa>, a nie <jakasKlasa>

"? extends jakasKlasa" = "Cokolwiek rozszerzającego jakasKlasa"

Jakby... sam nie wiem czy ma sens to, w jaki sposób to napisałem, ale chyba wiesz, o co chodzi...

0

Domyśliłem się, że trzeba to zawsze zaisywać jako <? extends MyClass>, ale interesuje mnie, dlaczego tak jest ;) Interesują mnie szczegóły techniczne ;P

0

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;
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1