Překladač tohle za tebe řešit nemůže, protože k tomu dochází až v runtime. (Překladač nemůže tušit, že při běhu bude ausgerechnet třetí prvek pole Age a ne Int).
Tohle už jsi kdysi kdesi tvrdil, a já s tebou v tomto stále nesouhlasím. Žádný runtime, a překladač to může zajistit. Viz ten kód.
On myslí, že když máš instanci List<Int> a žádné další informace, tak jen za běhu můžeš zjistit, že nějaký prvek je třeba typu Age (nebo prostě nějakého podtypu). To je ten základní důvod pro existenci virtuálních metod. Zmíněné aserce v Go jsou vlastně jen (konceptuálně) dynamic_cast.
Já mu snad rozumím dobře, ale stejně nesouhlasím :-)
Mám instnaci
List<Int> a pokud mohu do
List<Int> uložit
Age, kterýžto je subtyp
Int, tak si sice musím někde evidovat, že zrovna tato třetí hodnota není
Int, ale
Age, to jako jo, a to asi bude muset být nějak naimplementováno...
Každopádně překladač a nikoliv runtime mi zajistí, abych nemohl k těm prvkům
List<Int> přistupovat jen jako k
Age, a že k nim mohu přistupovat (po patřičném switchi) jako
Age, a nemůžu jako k
String.
Můj cíl je vždycky compile time, i za cenu složitější práce překladače. A v tomto případě bych řekl, že to stále jde.