Простите меня, если этот вопрос в основном основан на мнениях, но у меня такое ощущение, что это не так, и есть веская причина для выбора. Итак, вот пример. К сожалению, это очень долго, но очень просто:Компилятор интерпретации переопределения и перегрузки
Интерфейс:
public interface Shape
{
double area();
}
Реализация класса 1:
import static java.lang.Math.PI;
public class Circle implements Shape
{
private double radius;
public Circle(double radius)
{
this.radius = radius;
}
public double area()
{
return PI*radius*radius;
}
}
Реализация класса 2:
public class Square implements Shape
{
private double size;
public Square(double sideLength)
{
size = sideLength;
}
public double area()
{
return size*size;
}
}
Driver:
Shape[] shapes = new Shape[]{new Circle (5.3), new Square (2.4)};
System.out.println(shapes[0].area()); //prints 88.247...
System.out.println(shapes[1].area()); //prints 5.76
Работает с .area()
по умолчанию Circle
и Square
. Теперь, вот где мой вопрос действительно начинается. Допустим, что водитель имеет следующие методы:
public static void whatIs(Shape s)
{
System.out.println("Shape");
}
public static void whatIs(Circle s)
{
System.out.println("Circle");
}
public static void whatIs(Square s)
{
System.out.println("Square");
}
Если мы называем:
whatIs(shapes[0]); //prints "Shape"
whatIs(shapes[1]); //prints "Shape"
Это происходит потому, что Java интерпретирует объекты как Shape
с и не Circle
и Square
. Конечно, мы можем получить желаемый результат через:
if (shapes[0] instanceof Circle)
{
whatIs((Circle) shapes[0]); //prints "Circle"
}
if (shapes[1] instanceof Square)
{
whatIs((Square) shapes[1]); //prints "Square"
}
Теперь, когда у нас есть фон мой вопрос: «Форма»
Какие причины внесли вклад в разработку компилятора/языка, например, что whatIs(shapes[0]);
будет печатать Как и в, почему компилятор Java точно различает переопределенные методы для связанных объектов, но не перегруженные методы? Более конкретно, если только методы, которые водитель должен доступ являются:
public static void whatIs(Circle s)
{
System.out.println("Circle");
}
public static void whatIs(Square s)
{
System.out.println("Square");
}
и мы пытаемся назвать,
whatIs(shapes[0]);
whatIs(shapes[1]);
мы получим две ошибки (один для Square
и один для Circle
) с указанием что:
- метод Driver.whatIs (площадь) не применяется
- фактический аргумент Форма не может быть преобразована в площадь путем преобразования вызова метода
Итак, опять же, теперь, когда мы получили к суровым будням, почему может Java не справиться с ситуацией, как это? Как и в случае, если это сделано из-за проблем с эффективностью, это просто невозможно из-за некоторых дизайнерских решений, это плохая практика по какой-то причине и т. Д.?
Кроме того, если у кого-то есть лучшая идея для названия, пожалуйста, сделайте предложение или отредактируйте его, я знаю, что он, вероятно, не самый лучший, но не мог придумать ничего лучшего. Спасибо всем, кто сделал это через этот пост! –
Я предлагаю вам пройти через [JLS Section 15.2.2] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2) (Перегрузка) и [JLS Section 8.4.8.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.1) (Переопределение) –
Интересный вопрос и @ RohitJain благодарит за комментарий, мне тоже придется их прочитать. –