Ano, to je asi nejčastější použití. To že takto deklarovaný parametr je
efektivně read-only (pokud tedy mluvíme o kolekcích) je dobré, dokonce
žádoucí.
U proměnných situace trochu jiná...

Kamil Podlešák

2010/11/25 "Zdeněk Troníček" <[email protected]>

> Konstrukci ? extends Neco bych nezavrhoval, protoze je užitečná pro
> parametry metody.
> Př.: metoda, která provede nějakou operaci se všemi prvky seznamu, v němž
> je každý prvek typu Number.
>
> void perform(List<? extends Number> p) {
>    for (Number n : p) {
>        process(n);
>    }
> }
>
> void process(Number n) { ... }
>
> Takto lze metodu perform volat s parametrem typu List<Integer> i
> List<Double>.
>
> Z.
> --
> Zdenek Tronicek
> FIT CTU in Prague
>
>
> Kamil Podlesak napsal(a):
> > Krátká verze = praktická rada: Konstrukci ? extends (a super) se
> > snažte vždy vyhnout. Zvlášť u proměnných.
> >
> > Pro správné pochopení je potřeba plně rozumět kovarianci a
> > kontravanrianci
> > (
> http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29
> ),
> > nicméně i tak to nemusí být intuitivně vidět. Pokusím se to popsat
> > zjednodušeně "prakticky":
> >
> > Pozn: předpokládejme   class C extends A
> >
> > Proměnná typu DaoA<? extends A> totiž _neznamená_ "instance DaoA u
> > které si můži za T dostadit jakéhokoliv potomka A co právě mám". To by
> > bylo DaoA<A>
> >
> > Proměnná typu DaoA<? extends A> ve skutečnosti znamená, že do ní můžu
> > přiřadit nějakou instanci DaoA, která má nějaký konkrétní parametr -
> > může se jednat o DaoA<A>, DaoA<B> nebo DaoA<C>, kompilátor to neví (?
> > extends A mu explicitně řeklo, že to nesmí vědět).
> > Když pak vidí dao.doSometning(new B()) tak se podívá na ten parametr a
> > vidí, že tím parametrem je nějaký typ který nezná. Může to být A, může
> > to být B, může to být ale klidně C! Pokud by tam dovolil předat new
> > B(), tak v tom posledním případě klidně může dojít ke
> > ClassCastException.
> >
> > Kamil Podlešák
> >
> > 2010/11/25 Martin Beranek <[email protected]>:
> >> 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
> >>
> >>
> >>
> >> Dne 25.11.2010 08:06, Martin Beranek napsal(a):
> >>> Zdravím,
> >>>
> >>> proč toto nefunguje?
> >>>
> >>> private class B {}
> >>>
> >>> private class Test<T> {
> >>>     void doSomething(T param) {}
> >>> }
> >>>
> >>> a nekde potrebuji
> >>>
> >>> Test<? extends B> t = new Test<B>();
> >>> t.doSomething(new B()); // toto nelze zkompilovat
> >>>
> >>> diky
> >>>
> >>
> >> --
> >> Martin Beránek
> >> ICZ a.s., Pobočka Brno
> >> Londýnské náměstí 2/856, 639 00  Brno
> >> Tel.: +420 222 272 323
> >> Tel.: +420 222 272 111
> >> Fax.: +420 222 272 122
> >> mailto:[email protected]
> >> http://www.i.cz
> >>
> >>
> >
>
>

Odpovedet emailem