Le compilateur est pas assez intelligent pour savoir que objFoo1
est vraiment un Foo1
simple. Il n'analyse pas suffisamment votre code source pour le déterminer. Tout ce qu'il voit est que objFoo1
est un Foo1
, Foo2
est dérivé de Foo1
, et donc la distribution est légal. Si à la place vous changiez cela en (int) objFoo1
, il bombarderait au moment de la compilation puisque le compilateur pourrait voir qu'il n'y a aucun moyen de transformer un Foo1
en un entier. Imaginez qu'il y avait 1000 lignes de code entre les deux déclarations, beaucoup d'entre elles effectuant diverses affectations à objFoo1
. Le compilateur devrait faire beaucoup de travail pour essayer de déterminer quel objet est exactement dans objFoo1
. En général, il ne sera pas toujours en mesure de le faire. Il est beaucoup plus facile pour le compilateur de prendre simplement les informations de type statique à leur valeur nominale et de supposer que objFoo1
est un type d'objet Foo1
mais pas plus. De cette façon, il ne rejette pas votre programme de test simple mais accepte un programme plus compliqué.
Ce n'est pas non plus le travail du compilateur de rejeter votre code, dans ce cas. Il est possible, bien qu'étant tiré par les cheveux, que vous essayiez intentionnellement de générer un ClassCastException
en faisant une distribution illégale. Ce serait inhabituel mais pas illégal de le faire.
Le long de ces lignes, il existe d'autres cas où l'analyse de code statique du compilateur peut être trompée. Cela ne parviendra pas à compiler:
return;
System.out.println("hello world!"); // compile error - unreachable code
Bien que cela compilera bien même si elle est sémantiquement identique:
if (true) return;
System.out.println("hello world!");
Désolé. Je ne suis pas capable de formater correctement le bloc de code. Pourquoi devinez-vous? – csharpbaby
ok. J'ai utilisé le formateur de code. maintenant le code semble bien :) – csharpbaby
Désolé, nous avons essayé de vous aider à formater le code après avoir lu votre premier commentaire. – David