이 질문이 주로 의견을 바탕으로 한 것이라면 용서해주십시오.하지만 필자는 그것이 선택되지 않았으며 선택의 타당한 이유가 있음을 인정합니다. 여기 예제가 있습니다. 죄송합니다, 정말 긴하지만, 매우 간단합니다오버라이드와 오버로딩에 대한 컴파일러 해석
인터페이스 :
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;
}
}
드라이버 :
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");
}
을 우리가 호출하는 경우 : 자바 Circle
및 Square
Shape
들로 개체를 해석하지 때문에
whatIs(shapes[0]); //prints "Shape"
whatIs(shapes[1]); //prints "Shape"
이 발생합니다. 이제 우리는 내 질문은 배경을 가지고
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");
}
우리가 나타내는 우리가 두 가지 오류 (Square
에 대한 하나 Circle
하나)를 얻을 것이다
whatIs(shapes[0]);
whatIs(shapes[1]);
호출을 시도 그 :
- 방법 Driver.whatIs (광장)이 적용되지 않습니다
- 실제 인수 모양은
그래서 다시, 지금 우리가 핵심적 껄끄 러운, 자바와 같은 상황을 처리 할 수없는 이유를 늘어 놓던 것을 메소드 호출 변환에 의해 광장으로 변환 할 수 없습니다 이? 마찬가지로, 이것은 효율성에 대한 우려로 이루어지며, 일부 설계 결정으로 인해 가능하지 않을 수 있으며, 이는 어떤 이유로 든 나쁜 관행입니까?
또한 누구나 제목에 대해 더 좋은 아이디어가 있다면 제안을하거나 편집 해주세요. 아마 가장 좋은 것은 아니지만 더 나은 것을 생각할 수는 없습니다. 이 게시물을 통해 모든 사람들에게 감사드립니다! –
[JLS 섹션 15.2.2] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2) (오버로드) 및 [JLS 섹션 8.4.8.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.1) (재정의) –
재미있는 질문 및 @ RohitJain이 의견에 감사 드리며, 나는 그것들을 또한 읽어야 할 것입니다. –