Как работает этот кастинг?О полиморфизме-кастинге Java - PullRequest
0 голосов
/ 30 января 2019

Пожалуйста, не зацикливайтесь на орфографических ошибках.Я не понял, почему функция Prof'а Saluer работает с аргументами Prof в выводе на экран.

Вывод кода:
Мес.Коллега Неймана!


Моя личная класс.

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 + ".";
    }
}

Мой другой класс (PROF)

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 ]

0 голосов
/ 30 января 2019

Проблема в том, что у класса 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, и поэтому компилятор этого не знает.

0 голосов
/ 30 января 2019

Ваш метод saluer() принимает объект Personne, а ваш объект Prof расширяет Personne, так что это означает, что вы (или, в данном случае, компилятор) можете привести Prof к Personneбез каких-либо ошибок, потому что они основаны на одном и том же классе.

Вы всегда можете привести вверх в дерево наследования

Personne
  |
  +-- Prof
  |
  +-- Etudiant

Также было бы возможно привести Etudiant кPersonne.Или вы можете привести Etudiant к Personne, а затем обратно к Etudiant, что тоже сработает.Но вы не можете разыграть Etudiant до Prof, потому что они находятся на одном уровне в дереве наследования.

...