Dobrý den,
za prvé: Typový parametr K definovaný u statické metody getInstance() je
jiný než K definovaný u třídy A. Je to jen shoda jmen.
Za druhé: v getInstance se vrací v podstatě A, ale navenek se metoda
tváří, že vrací A pro libovolné K. Kdyby to překladač povolil, pak by
bylo možné napsat
class D implements Serializable {}
A ad2 = getInstance();
a přiřazení z A do A by spadlo až za běhu, což je proti hlavnímu účelu
generik.
Kořen problému je v tom, že v metodě getInstance pravděpodobně chcete
vytvářet různé potomky A, což se rozhoduje až v runtime, a zároveň do
signatury procpat generický argument potomka, což je ale záležitost
compile-time. K čemu tam takový argument klientovi metody getInstance() ale
bude, když to za překladu nelze rozhodnout?
Do zkompilovatelného stavu to dostanete opravou na public static A extends
Serializable> getInstance(), ale problém vidím spíš v tom, co od toho API
vlastně očekáváte.
Tomáš Záluský
2011/5/18 Behnil
>
>
> Ahoj, mam trosku problem pochopit jak funguje genericita(genericnost?).
>
> Mam tyto tridy:
>
> abstract class A {}
> class B extends A{}
> class C implements Serializable {}
>
> a chtel bych udelat tovarni metodu pro abstraktni tridu A. Jak to udelam??
> Kdyz napisu tohle:
>
> public static A getInstance() {
> return new B();
> }
>
> tak mi prekladac hlasi chybu "Type mismatch: cannot convert from B to A"
> :S
>
> Poradi nekdo?
> --
> Autor: Behnil
> Forum: Java
> Odkaz: http://forum.builder.cz/read.php?14,3323675,3323675#msg-3323675
>
Příspěvek zaslán emailem
Dobrý den,
za prvé: Typový parametr K definovaný u statické metody getInstance() je
jiný než K definovaný u třídy A. Je to jen shoda jmen.
Za druhé: v getInstance se vrací v podstatě A, ale navenek se metoda
tváří, že vrací A pro libovolné K. Kdyby to překladač povolil, pak by
bylo možné napsat
class D implements Serializable {}
A ad2 = getInstance();
a přiřazení z A do A by spadlo až za běhu, což je proti hlavnímu účelu
generik.
Kořen problému je v tom, že v metodě getInstance pravděpodobně chcete
vytvářet různé potomky A, což se rozhoduje až v runtime, a zároveň do
signatury procpat generický argument potomka, což je ale záležitost
compile-time. K čemu tam takový argument klientovi metody getInstance() ale
bude, když to za překladu nelze rozhodnout?
Do zkompilovatelného stavu to dostanete opravou na public static A extends
Serializable> getInstance(), ale problém vidím spíš v tom, co od toho API
vlastně očekáváte.
Tomáš Záluský
2011/5/18 Behnil
>
>
> Ahoj, mam trosku problem pochopit jak funguje genericita(genericnost?).
>
> Mam tyto tridy:
>
> abstract class A {}
> class B extends A{}
> class C implements Serializable {}
>
> a chtel bych udelat tovarni metodu pro abstraktni tridu A. Jak to udelam??
> Kdyz napisu tohle:
>
> public static A getInstance() {
> return new B();
> }
>
> tak mi prekladac hlasi chybu "Type mismatch: cannot convert from B to A"
> :S
>
> Poradi nekdo?
> --
> Autor: Behnil
> Forum: Java
> Odkaz: http://forum.builder.cz/read.php?14,3323675,3323675#msg-3323675
>
Příspěvek zaslán emailem
Citovat příspěvek