В приведенном ниже коде я получаю ошибку компилятора в b.printname() ;. Насколько я понимаю, ошибка связана с тем, что компилятор эффективно работает не полиморфным образом (т. Е. Компилятор по существу только выбирает смотреть на левую часть операнда и, следовательно, b является Вопросом). Так как b имеет тип Question, и поскольку у вопроса не существует метода noN args printName, вы получаете ошибку компиляции. Это верно? Теперь, полагая, что это правильно, мой вопрос - почему? Разумеется, компилятор должен знать, что вопрос b относится к объекту, который фактически поддерживает метод no-args printName? Например. если вы посмотрите, как работает компилятор с точки зрения кастинга, есть примеры, когда компилятор, из-за отсутствия лучшего слова, действует полиморфно или, говоря иначе, компилятор знает, что происходит с точки зрения правой стороны операнд и действует на это знание. Например, если тип интерфейса относится к объекту, который реализует интерфейс, то компилятор просматривает правую часть инструкции (т. Е. Объект, реализующий интерфейс), и решает, что никакого приведения не требуется. Итак, почему компилятор не действует таким образом, почему он не выглядит и не видит, что рассматриваемый объект на самом деле является синим, а синий действительно поддерживает метод no-arg метода printName?Java Compile time non polymorphism
public class Polymorf3 {
public static void main(String[] args){
Polymorf3 me = new Polymorf3();
me.doStuff();
}
public void doStuff() {
Bat a = new Bat();
Question b = new Blue();
//a.printName();
a.printName(a.name);
b.printName(); // Compiler Error:Required String Found no args
}
abstract class Question {
String name="Question_name";
public void printName(String name){ System.out.println(name);}
}
class Bat extends Question {
String name = "Bat_Bruce";
//public void printName(){ System.out.println(name);}
}
class Blue extends Question {
String name = "Clark";
public void printName() {System.out.println(name);}
}
}
Поскольку здесь 'b' содержит ссылку класса' Question'. – Satya