この質問が主に意見に基づいている場合は申し訳ありませんが、そうではなく、選択には十分な理由があると感じています。では、例を示します。申し訳ありませんが、非常に長いですが、非常に簡単です。
インターフェース:
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
これはand.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 がオブジェクトを and ではなく s として解釈するために発生し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"
}
背景がわかったので、私の質問は次のとおりです。「Shape」を出力する
ようなコンパイラ/言語設計に貢献した理由は何ですか? 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]);
次のことを示す 2 つのエラー ( に対して 1 つと に対してSquare
1 つCircle
) が表示されます。
- メソッド Driver.whatIs(Square) は適用されません
- 実引数 Shape はメソッド呼び出し変換で Square に変換できません
繰り返しになりますが、ここまでで要点を説明しましたが、なぜ Java はこのような状況を処理できないのでしょうか? 同様に、これは効率の問題のために行われているのでしょうか、設計上の決定のために不可能なのですか、これは何らかの理由で悪い習慣なのですか?