Nein. Es macht keinen Sinn, das zuzulassen.
Der Grund ist, weil Unterklassen allgemein zusätzliche Verhalten definieren. Wenn Sie einer Unterklassenreferenz ein Objekt der Oberklasse zuweisen könnten, würden Sie zur Laufzeit auf Probleme stoßen, wenn Sie versuchen, auf Klassenmitglieder zuzugreifen, die tatsächlich nicht existieren.
Zum Beispiel, wenn dies erlaubt wurde:
String s = new Object();
Sie würden in ein paar ziemlich schlechte Probleme stoßen. Was passiert, wenn Sie versuchen, eine String
Methode aufzurufen? Würde die Laufzeit abstürzen? Oder vielleicht würde ein No-Op durchgeführt werden? Soll das überhaupt kompilieren?
Wenn die Laufzeit abstürzen würde, könnten Sie Laufzeitprüfungen verwenden, um sicherzustellen, dass die Objekte, die Sie erhalten, tatsächlich die gewünschten Methoden enthalten. Aber dann implementieren Sie im Grunde Garantien, die das Java-Typsystem bereits zur Kompilierungszeit bereitstellt. Also kostet dieses "Feature" wirklich nichts als eine Menge Code-Check-Code, den Sie eigentlich gar nicht hätten schreiben müssen.
Wenn keine Ops anstelle von nicht vorhandenen Methoden ausgeführt wurden, wäre es extrem schwierig, sicherzustellen, dass Ihre Programme wie geschrieben ausgeführt würden, wenn die Mitglieder, auf die Sie zugreifen möchten, nicht existieren, da jede Referenz eine Object
sein könnte irgendein Punkt. Dies kann leicht zu handhaben sein, wenn Sie alleine arbeiten und Ihren gesamten Code kontrollieren, aber wenn Sie mit anderem Code umgehen müssen, verschwinden diese Garantien im Wesentlichen.
Wenn Sie möchten, dass der Compiler die Überprüfung durchführt, vorausgesetzt, dass Compiler-Autoren Sie nicht im Stich lassen und Ihnen ein ernstes Gespräch geben, dann sind Sie wieder bei "normalem" Verhalten. Also wieder, es ist nur eine Menge Arbeit für null Nutzen.
Lange Rede kurzer Sinn: Nein, es ist nicht erlaubt, weil es null Sinn, so zu tun macht, und wenn eine Sprache Designer versucht, zu ermöglichen, dass sie eingesperrt werden würden, bevor sie mehr Schaden anrichten könnten.
Es würde keinen Sinn ergeben. Wenn es erlaubt wäre, könnten Sie Felder/Methoden haben, die Sie erwarten würden, dort zu sein, die nicht wirklich dort sind. Wenn es erlaubt wäre, wären die Sprachdesigner vielleicht irgendwo weggeschlossen worden, wo sie keinen Schaden mehr anrichten könnten. – awksp
was erwartest du würde passieren? – Mark