Как работает этот кастинг? О полиморфизме-кастинге Java
Пожалуйста, не зацикливайтесь на орфографических ошибках. Я не понял, почему функция saluer Prof'а работает с аргументами Prof в выводе на экран.
Вывод кода:
Mes homoms для ma / mon collègue Neumann!
Мой Персональный класс.
class Personne {
String nom;
Personne() {
this("Anonymus");
}
Personne(String nom) {
this.nom = nom;
}
String saluer(Personne p) {
return this.nom + " salue " + p.nom + " !";
}
public String toString() {
return "La personne " + nom + ".";
}
}
Мой другой класс (ПРОФ)
class Prof extends Personne {
String nomCours = "Java";
Prof() {
}
Prof(String arg) {
this("NoName", arg);
}
Prof(String arg1, String arg2) {
super(arg1);
this.nomCours = arg2;
}
String saluer(Prof p) {
return "Mes hommages pour ma/mon collègue " + p.nom + " !";
}
String saluer(Personne p) {
return "La/le prof " + this.nom + " présente ses hommages à " + p.nom + " !";
}
String saluer(Etudiant e) {
if (this.nomCours.equals(e.nomCours))
return "Bonjour à mon étudiant(e) " + e.nom + " !";
return "Bonjour de la part de " + this.nom + " !";
}
public String toString() {
return "Le prof " + nom + " donne le cours " + nomCours + ".";
}
}
Мой основной класс
public static void main(String[] args) {
Personne mixte1 = new Prof("Poincaré", "Math");
Personne mixte2 = new Prof("Neumann", "Info");
Personne mixte3 = new Etudiant("Toi", "Info");
System.out.println(mixte1.saluer(((Prof)mixte2))); // problem here
}
2 ответа
Ваш saluer()
метод занимает Personne
объект, и ваш Prof
объект расширяется Personne
, так что это означает, что вы (или, в данном случае, компилятор) может привести Prof
в Personne
без каких-либо ошибок, потому что они основаны на одном классе.
Вы всегда можете бросить вверх в дереве наследования
Personne
|
+-- Prof
|
+-- Etudiant
Также было бы возможно разыграть Etudiant
человеку. Или вы можете разыграть Этудиант Personne
а затем вернуться к Etudiant
это тоже сработало бы. Но вы не можете разыграть Etudiant
к Prof
потому что они находятся на одном уровне в дереве наследования.
Проблема в том, что класс Personne
не имеет метода saluer
это занимает другое Personne
в качестве аргумента. Твой класс Prof
делает, но в этой строке кода компилятор не знает этого. Вы могли бы (например) написать:
public static void main(String[] args) {
Personne mixte1 = new Prof("Poincaré", "Math");
Personne mixte2 = new Prof("Neumann", "Info");
Personne mixte3 = new Etudiant("Toi", "Info");
System.out.println(((Prof)mixte1).saluer(mixte2); // problem here
}
Чтобы ответить на общий вопрос: Java-компилятор старается как можно лучше узнать, какие методы объекта вы вызываете. Когда вы пытаетесь позвонить mixte1.saluer((Prof) mixte2)
, вы ошибочно думаете, что компилятор знает, что метод saluer(Prof prof)
существует с mixte1, но вы 'удручены' mixte1
к Personne
и, следовательно, компилятор не знает этого.