U Array to nevadí?
Citace: kuka 20. 09. 2012, 09:31:59Tedy bych si deklaroval List<Y> a predal ho metode, ktera pracuje s List<X>. Ta by do nej pridala instanci tridy Z (ktera je rovnez potomkem X). Potom bych postupne zpracoval prvky sveho List<Y> a volal na nich metody tridy Y. Co by se stalo, az bych narazil na instaci tridy Z? Kde by byla slibovana typova kontrola? Pro nazornost si dosadme treba X=Number, Y=BigDecimal, Z=Short.U Array to nevadí?
Tedy bych si deklaroval List<Y> a predal ho metode, ktera pracuje s List<X>. Ta by do nej pridala instanci tridy Z (ktera je rovnez potomkem X). Potom bych postupne zpracoval prvky sveho List<Y> a volal na nich metody tridy Y. Co by se stalo, az bych narazil na instaci tridy Z? Kde by byla slibovana typova kontrola? Pro nazornost si dosadme treba X=Number, Y=BigDecimal, Z=Short.
Ne nevadi. BTW jak Array souvisi s generiky a jejich typovou bezpecnosti?
Čistě z pohledu typového systému jsou kovariantní pole špatně a invariantní generiky správně. Ovšem use-site variance je peklo na druhou...
Citace: Ladislav Thon 20. 09. 2012, 11:16:49Čistě z pohledu typového systému jsou kovariantní pole špatně a invariantní generiky správně. Ovšem use-site variance je peklo na druhou...Můžeš trochu rozvést důvody? (pokud možno tak, abych to jako ne-fulltime programátor, ne-javista pochopil
No tak, že to, co u generik vůbec nejde, to u Array jde, ale vyvolá to runtime výjimku.
U generik je to správně proto že kontroly provádí přímo kompilátor. U polí je to špatně protože kompilátor nekontroluje a může to tedy vést k pádům programů za běhu, což je přesně to co by silně typový jazyk neměl dovolovat. No a to že je to jednou tak a podruhé tak je prostě to peklo na druhou...
A prave proto, ze by to vyvolalo behovou vyjimku, to u generik nejde, coz jsem se snazil vysvetlit. Tam by to vadilo, protoze generika zarucuji, ze k behove vyjimce nedojde, protoze se nesoulad typu objevi uz pri prekladu - to je ostatne hlavni prinos generik. Pole to nezarucuji a proto to u nich nevadi, kazdy proste vi/mel by vedet, ze k takove situaci muze dojit. Princip typove kontroly poli a generik je uplne jiny, coz je sice sveho druhu "souvislost", podle mne ale vzhledem k tematu generik irelevantni.
public static <T extends Comparable<? super T>> void sort(List<T> list)
Citace: kuka 20. 09. 2012, 11:40:09A prave proto, ze by to vyvolalo behovou vyjimku, to u generik nejde, coz jsem se snazil vysvetlit. Tam by to vadilo, protoze generika zarucuji, ze k behove vyjimce nedojde, protoze se nesoulad typu objevi uz pri prekladu - to je ostatne hlavni prinos generik. Pole to nezarucuji a proto to u nich nevadi, kazdy proste vi/mel by vedet, ze k takove situaci muze dojit. Princip typove kontroly poli a generik je uplne jiny, coz je sice sveho druhu "souvislost", podle mne ale vzhledem k tematu generik irelevantni.No takže u polí to vadí taky, ale tam to "každý ví"
Pak to vede na úchvatné signatury metod typu:Kód: [Vybrat]public static <T extends Comparable<? super T>> void sort(List<T> list)
V 99% uloh neni zadny duvod pouzivat pole misto kolekci a nedoporucuje se to (napr. proto, ze pole jsou z principu vzdy modifikovatelna). Pole maji misto tam, kde je potreba vysoky vykon, predevsim ve vztahu k primitivnim typum.
Citace: Natix 20. 09. 2012, 12:05:17 Pak to vede na úchvatné signatury metod typu:Kód: [Vybrat]public static <T extends Comparable<? super T>> void sort(List<T> list)No dyť jsem říkal, že z toho na mě dýchá C++
@kuka: asi si nerozumíme. Chtěl jsem říct, že ve mně budí podezření jazyky, kde A funguje nějak a B, které je A velmi podobné, funguje úplně opačně - ale zároveň komunita tvrdí, že to, jak B funguje, je bomba.