2013-05-07 9 views
6

Chcę zarządzać ArrayList klas.ArrayList klas: ArrayList <Class>, ale jak zmusić te klasy do rozszerzenia klasy super?

Na przykład mam 3 rodzaje filtrów: TextFilter, DurationFilter i TimeFilter, które rozszerzają Filter.

To wydaje się być poprawne:

List<Class> filters = new ArrayList<Class>(); 

filters.add(TextFilter.class); 
filters.add(DurationFilter.class); 
filters.add(TimeFilter.class); 

Ale teraz chcę powstrzymać typu ArrayList z

List<Filter.class> filters = new ArrayList<Filter.class>(); 

filters.add(TextFilter.class); 
filters.add(DurationFilter.class); 
filters.add(TimeFilter.class); 

Ale wydaje się, że nie jest prawidłowe. Czy możesz mi wytłumaczyć dlaczego? Czy masz rozwiązanie, które pozwala tylko akceptować klasy potomne Filter, które mają być dodane w mojej tablicy ArrayList? Dzięki.

+1

Więc chcesz, aby przyjmować tylko wartości, które pochodzą z oceny '' X' X.class' gdy jest klasa rozszerzająca "Filtr". Uważam, że jest to niewyrażalne w systemie typu Java. –

Odpowiedz

17

Użyj? w rodzajach ogólnych.

List<Class<? extends Filter>> filters = new ArrayList<Class<? extends Filter>>(); 

Ponieważ chcesz obiektów klasy, a nie instancji.

+0

Czy próbowałeś dodać element do takiej listy? Myślę, że dodanie przedmiotu jest niedozwolone. – gogognome

+0

@gogognome - Wydaje się działać: http://ideone.com/2Zevrk –

+0

Działa. Dziękuję Ci! – Julien

0

Jestem żadnych wielkich wstrząsów na rodzajowych, ale wierzę, że składnia jest wzdłuż linii

List<? extends Filter> filters = new ArrayList<? extends Filter>(); 
+0

Spowoduje to ograniczenie listy do instancji typu "Filtr", ale OP chce mieć listę * klas *, a nie instancji. –

+0

@Rob Masz rację - błędnie przeczytałeś oryginalne pytanie ..... – DaveH

1

Spróbuj z

List<Class<? extends Filter>> 

Class obsługuje parametr typu iz? rozciąga Filtr można określić każdą podklasę Filtr

Powiązane problemy