Teď to celkem logicky spadne, protože jsou k dispozici kovariantní a
kontravariantní typy. Ale kdyby nebyly, tak by se to mohlo chovat podobně
jako pole. Přetypovaní by bylo povoleno (mohlo by být i nepovinné) a za
běhu by se prováděla kontrola, zda se do seznamu vkládá správný typ. Pokud
ne, nastala by výjimka.

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


Petr Balat napsal(a):
> v .NETu vám
> IList<string> s = ...;
> IList<object> o = (IList<object>) s;
> spadne za běhu na
> System.InvalidCastException: Unable to cast object of type
> 'System.Collections.Generic.List`1[System.String]' to type
> 'System.Collections.Generic.IList`1[System.Object]'.
> Lze ale napsat
> IEnumerable<object> o = s;
> protože je IEnumerable definován jako koo. viz IEnumerable<out T>
> http://msdn.microsoft.com/en-us/library/9eekhta0.aspx
> potom můžeme pole procházet.
> Jinak souhlasím že v .NETu jsou generické typy promakanejší:-)
>
> Petr
>
>
>
> Dne 20. září 2011 23:41 "Zdeněk Troníček" <[email protected]>
> napsal(a):
>
>> Podle mého názoru jsou generické typy v .NET trochu lepší. Hlavní
>> argument
>> je ten, že odmazaní typového parametru vede k tomu, že jej nelze použít
>> např. za new nebo instanceof. A to většina programátorů neočekává. Proto
>> se mi zdají generické typy v .NET více intuitivní a tudíž lepší.
>>
>> Z.T.
>> --
>> Zdenek Tronicek
>> FIT CTU in Prague
>>
>>
>> Ondra Medek napsal(a):
>> > Nebyl bych si tak jisty, jestli to reseni v .NET je lepsi nez v Jave.
>> > V .NET museli pridat dalsi vlastnost jazyka "in" a "out", cimz se
>> > jazyk zase komplikuje. V Jave je bezne, kdyz uz ty generika
>> > programatora s**ou udelat jiz uvedene
>> >
>> > List<T> list = (List)listParam; //překladačem projde i za runtime a
>> >
>> > spolu se SupressWarning a jede se vesele dal. Takove reseni jsem beze
>> > videl treba v Hibernate nebo jinych proflaklych knihovnach, i kdyz
>> > nekdy sla dana situace vyresit spravnou aplikaci Java generik
>> > (extends, super, ?).
>> >
>> > Ano zaryti puriste jiste vznesou namitky,  ale pokud je funcknost
>> > uzavrena v nejake tride/metode/modulu a otestovana, tak to IMHO
>> > nevadi.
>> >
>> > 2011/9/20 Petr Balat <[email protected]>:
>> >> - Dobře tedy pro kompilátor je to jiná třída ale výsledek pro jvm je
>> to
>> >> ta
>> >> samá. na tom se snad shodneme at tu neslovičkaříme
>> >> :-)
>> >> - jinak jsem psal ze generiky pro překladač nejsou koo. ani koontra.
>> tak
>> >> jak
>> >> jste vypsal odstravec z wiki viz "Unlike arrays, generic
>> >> classes are neither
>> >> covariant nor contravariant".
>> >> Nicméně myslím si že je důležitější vědět jak se generiky mají v
>> plném
>> >> kontextu, takže i vlastnosti jvm, proto ten komentář.
>> >> Aby se začátečník nespletl např. při kontrole instanceof apod. kde
>> ten
>> >> rozdíl mezi runtime a kompilaci je potřeba znát.
>> >> Pokud programátor potřebuje pracovat s reflexí tak už tato znalost je
>> >> nutná.
>> >> -ano do .net museli přidat koo. a kontra. v gener. protože to nešlo
>> >> obejít
>> >> tak jako v jave (když pomineme warning za předpokladu že programátor
>> >> musí
>> >> znát i výsledek kompilace).
>> >> V .NETu je IList<string> a IList<object> jinej typ jak pro kompilátor
>> >> tak i
>> >> pro virtuální mašinu.
>> >> List<Predek> map = (List)listPotomek; //překladačem projde i za
>> runtime
>> >> a
>> >> nejspíš bude typová kontrola pro další část kódu užitečná.
>> >> //v .net by to za runtime spadlo
>> >> Petr
>> >>
>> >>
>> >> Dne 20. září 2011 15:15 "Zdeněk Troníček" <[email protected]>
>> >> napsal(a):
>> >>>
>> >>> Ladislav Thon napsal(a):
>> >>> >> - V Javě je Iterable<String> potomkem Iterable<Object> protože je
>> to
>> >>> > v reálu ten samej objekt - pouze překladač nás může chránit tak
>> jako
>> >>> > máte
>> >>> > ve
>> >>> > 2 příkladě.. (to samé pro List)
>> >>> >
>> >>> > IMHO nejlepší je dívat se na parametrizované třídy jako na funkce,
>> >>> které
>> >>> > vytváří "normální" třídy, a vykašlat se na implementační detaily
>> (i
>> >>> když
>> >>> > ty
>> >>> > detaily v Javě jsou někdy bohužel pekelně důležité).
>> >>> >
>> >>> > A i když sestoupíte na tu implementační úroveň, stejně není
>> >>> podstatné,
>> >>> > jestli je Iterable<String> potomkem Iterable<Object> (což
>> technicky
>> >>> je,
>> >>> > pokud definujeme relaci dědičnosti jako reflexivní), ale to,
>> jestli
>> >>> > Iterable<String> je nebo není _podtypem_ Iterable<Object>. A to
>> >>> rozhodně
>> >>> > není.
>> >>>
>> >>> Jenže tahle diskuze je o překladu a warningu překladače. Jinak Tvoje
>> >>> terminologie mě překvapuje, protože pro mě jsou potomek a podtyp
>> >>> synonyma.
>> >>>
>> >>> Z.T.
>> >>> --
>> >>> Zdenek Tronicek
>> >>> FIT CTU in Prague
>> >>>
>> >>
>> >>
>> >
>> >
>> >
>> > --
>> > Ondra Medek
>> >
>> >
>>
>>
>

Odpovedet emailem