8 komentáře “Oříšek v reflexní analýze generik

  1. Ha zmizely špičaté závorky… No ale snad je to jasné, prostě cokoliv typu MyType nebo jeho podtypu mohu předhodit čemukoliv co umí pracovat s typem MyType nebo jeho nadtypem.

  2. ad Pavel Savara) O C# nevím vůbec nic, nicméně k těm bounded wildcards – upper a lower bound tvoří logickou dvojici třeba ve vztahu operátor/operand. Například pro setřídění List mohu použít Comparator. Prostě podle toho, co dělám, se na hierarchii dědičnosti dívám z jedné nebo druhé strany. Je to dost přirozený požadavek, těžko říct, zda se „v přírodě“ vyskytuje vzácně.

  3. ad benzin) musím říct, že to byla trochu škola, ale mám pocit že se mi to podařilo protunelovat – knihovnu na řadě instalací už používáme a funguje to poměrně intuitivně a hlavně bez dalšího přemýšlení … složitý kód je v AOP advicách ale klientský kód už je velmi přehledný a čitelný

  4. Tento problem sem taky resil. Nakonec sem rezignoval na genericky primarni klic apouzivam String. Pokud z nejakeho duvodu je databaze schopna pracovat rychleji s klicem jineho typu (napr. celociselnym, nebo Key v GAE) tak neni problem prevod mezi klicem a stringem naimplementovat primo v metode getId() a setId() a mapovat ho do jineho fieldu s typem vhodnym pro tu kterou databazi.

    Zjistis ze si tak usetris strasnou spoustu problemu. Hlavne strasnou spoustu psani. Po nekolika hroznych mesicich straveny spodobnymi pokusy sem prisel na to ze generiky na tohle fakt nejsou vhodne.

  5. ad Marián) Pokud by bylo záměrem informace o typech zcela skrýt, pak by pravděpodobně neexistovaly metody jako Class.getGenericSuperclass(). Smyslem erasure je zpětná kompatibilita a ta těžko může být možností inspekce prostřednictvím reflexe nějak dotčena.

  6. ad Pavel Savara) přiznám se, že jsem se snažil proniknout do tvých problémů, ale moc se mi to nezadařilo. Potřeboval bych asi hlubší poznání toho problému, abych dokázal reagovat. Navíc v C# jsem úplný analfabet, takže nevím, jaké možnosti / problémy jsou na druhé straně – nicméně věřím, že se snažit implementovat konverzi generik z dvou, takto oddělených světů musí být oříšek na druhou.

    Díky za komentář, ale za mě se bohužel žádné cenné reakce asi nedočkáš 😉

  7. Ono je vôbec zaujímavé, že sa to dá takto „hacknúť‘.
    Zmyslom erasure je aj to, aby to nešlo. Kvôli spätnej kompatibilite.
    Vďaka za tip!

  8. Ahoj,

    to co tady pises se mi bude casem hodit. Ale nejdrive musim vyresit jiny orisek, myslim ze je to jeste o level obtiznejsi.

    Delam po vecerech http://jni4net.sf.net, objektovy bridge mezi Javou a C#. Tak jako ty pouzivam reflection a z ni generuju proxy. Rozdil je v tom ze k Javovske tride generuju C# proxy. A ted ten orisek.

    1) Pro ArrayList<E> na strane C# potrebujeme zaroven ArrayList<E> a zaroven ArrayList.
    Pri cemz ArrayList je idealne zdedeny z ArrayList<Object>, co se signatur metod tyce.
    Ale na druhou stranu, prirazeni ArrayList x = new ArrayList<String>(); musi byt ok.
    Da se to asi prechytracit pomoci implicitnich konverzinch operatoru v C#. Ale pouze pro tridy, pro interfacy je to prohrane.

    2) Java ma wildcard „?“. Ten znamena neco ve smyslu, dej si tam co chces, na runtime to bude stejne Object. Z toho vyplyva nasledujici:
    a) Existuje bounded wildcard. V C# existuje pouze upper bound. S lower bound je to horsi Collection<? super Person>. Ja doufam ze se v prirode vyskytuje vzacne a proto ho muzu zanedbat.
    Tady se da genericky wildcard ? vynechat na deklaraci tridy a pridat na deklaraci metodygenericky parametr T, to resi nektere zapeklitosti. Nevim jeste jestli vsechny.

    b) Existuje dedicnost z wildcard typu, a to je mazec. Vubec nevim co s tim.
    WeakClassKey extends WeakReference<Class<?>>{
    Class<?> getClass(){
    }
    }

    Zatraceny type erasure, jakakoliv dobra rada je mi cenna.
    Pavel