1. jestli je to jediná věc, u které je ne-korektní, nebo je jich víc (jasně že jedna věc stačí k tomu aby byl nekorektní jako takový, ale to teď nemyslím)
V Dartu to jsou ještě kovariantní generika - typový systém povolí kontravarianci, ale za běhu to spadne. Například
abstract class Zvire { void jez(); }
class Pes extends Zvire { void jez() { print("Pes"); } }
abstract class Krmic<A> { void nakrm(A a); }
class ZvireKrmic extends Krmic<Zvire> {
void nakrm(Zvire z) { z.jez(); }
}
void f(Krmic<Pes> k, Pes p) {
k.nakrm(p);
}
void start() {
f(new ZvireKrmic(), new Pes());
}
projde typovou kontrolou, ale za běhu vyhodí
Breaking on exception: type 'ZvireKrmic' is not a subtype of type 'Krmic<Pes>' of 'k'.
TypeScript má například špatně varianci u polí (měly by být invariantní, neměnná pole mohou být kovariantní, pole pouze pro zápis mohou být kontravariantní, v TypeScriptu jsou však bivariantní) a argumentů funkcí (měly by být kontravariantní).
2. V čem je to zjednodušení pro programátora? Že může použít downcast bez toho, aby to udělal explicitně? To mi moc jako výhoda ani nepřijde 
Údajně je to intuitivnější.