// Shape クラスとそのサブクラス Circle クラス、Square クラス
class Shape {
void draw() {
System.out.println("Drawing a shape");
}
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing a circle");
}
void calculateArea() {
System.out.println("Calculating the area of a circle");
}
}
class Square extends Shape {
void draw() {
System.out.println("Drawing a square");
}
void calculateArea() {
System.out.println("Calculating the area of a square");
}
}
public class Main {
public static void main(String[] args) {
// Shape クラス型の配列を作成
Shape[] shapes = new Shape[3];
// 異なる形状のオブジェクトを配列に格納
shapes[0] = new Circle();
shapes[1] = new Square();
shapes[2] = new Shape();
// 配列からオブジェクトを取り出してダウンキャストして特有のメソッドを呼び出す
for (Shape shape : shapes) {
if (shape instanceof Circle) {
Circle circle = (Circle) shape;
circle.calculateArea();
} else if (shape instanceof Square) {
Square square = (Square) shape;
square.calculateArea();
}
}
}
}
この例では、Shape
クラス型の配列を作成し、異なる形状のオブジェクトを格納しています。そして、配列から要素を取り出して、各要素を Circle
クラスや Square
クラスにダウンキャストして、それぞれの特有のメソッド(calculateArea
メソッド)を呼び出しています。instanceof
演算子を使用して、ダウンキャストが成功するかどうかを確認しています。
配列でのダウンキャスト
配列でのダウンキャストにはいくつか重要なポイントがあります。以下に、その解説をします。
- 要素の実際の型の確認 (
instanceof
演算子):- 配列から要素を取り出す前に、その要素が期待する型であるかを確認するために
instanceof
演算子を使用します。 instanceof
演算子は、左辺のオブジェクトが右辺のクラスのインスタンスであればtrue
を返し、そうでなければfalse
を返します。- この確認を行うことで、ダウンキャストが成功するかどうかを安全に確認できます。
- 配列から要素を取り出す前に、その要素が期待する型であるかを確認するために
- 要素のダウンキャスト:
instanceof
演算子で確認した後、実際にダウンキャストを行います。- ダウンキャストを行う際には、キャスト演算子
(Type)
を使用します。 - ダウンキャスト後には、その要素の型に合わせたメソッドを安全に呼び出すことができます。
問題の解答例ではShape
クラス型の配列に異なる形状のオブジェクトを格納し、配列から要素を取り出して instanceof
演算子で型を確認した後、ダウンキャストして特有のメソッドを呼び出しています。