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.