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 >> > >> > >> >> >
