Zur Laufzeit steht dem System natürlich die Typinformation zur Verfügung, sonst würde ja auch der Cast nicht funnktionieren, bzw. könnte keine Cast Exception werfen wenn der Cast ungültig ist.

Zur Übsetzungszeit geht das nicht, bzw. nicht allgemein, weil der Compiler sonst für jede Variable des Interface-Typs alle möglichen Codepfade zurückverfolgen müsste um sicher zu gehen, dass der aktuelle Inhalt nur von einem bestimmten Typ sein kann.

Nach einer Zuweisung auf eine Variable des Interface-Typs ist für den Compiler nur mehr dessen API "sichtbar" (upcast).

Wenn man dann Zugriff auf implementierungspezifische API braucht, muss man dem Compiler diese Sichtbarkeit mitteilen (downcast). Der Compiler fügt dann auch Code ein, der dann zu Laufzeit prüft ob das eine korrekte Annahme war und, falls das nicht der Fall war, eine Exeception wirft.

Ciao,
_