generika a '? extends Xxx'

Martin Kuba makub na ics.muni.cz
Čtvrtek Listopad 25 09:25:50 CET 2010


Dne 25.11.2010 08:26, Martin Beranek napsal(a):
> Tak si trošku odpovím sám. Je třeba použít T<? super B>, ale neřeší to
> můj problém...
>
> private class A {}
>
> private class B extends A {}
> 	
> private abstract class DaoA<T extends A>  {
>      void doSomething(T param) {}
> }
>
> private class DaoB extends DaoA<B>  {}
>
> a pak potrebuji
>
> DaoA<? extends A>  dao = new DaoB();
> dao.doSomething(new B()); // nejde přeložit

Hm, generika dovedou být dost neintuitivní. Musel jsem si znovu přečíst
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
abych to pochopil. Vysvětlení je na straně 7 nahoře, v jednodušší
formě se to dá demonstrovat na tomhle příkladu:

Set<? extends Object> s = new HashSet<String>();
s.add("ZZZ"); //nejde přeložit

Jde o to, že <? extends Object> může být cokoliv, třeba Float, nemusí to být
String, takže kompilátor nemůže dovolit do takové množiny String přidat.
Musí se to napsat právě jako

Set<? super String> s = new HashSet<String>();
s.add("ZZZ"); //v pořádku

Makub
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno             Martin Kuba
Institute of Computer Science    email: makub na ics.muni.cz
Masaryk University             http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ     mobil: +420-603-533775
--------------------------------------------------------------


Další informace o konferenci Konference