sealed / record / instanceofパターン難易度 標準無料
次のコード(Java 17)の出力として正しいものを選べ。
1 public class Q7 {
2 sealed interface Shape permits Circle, Square {}
3 record Circle(double radius) implements Shape {}
4 record Square(double side) implements Shape {}
5
6 static String describe(Shape s) {
7 if (s instanceof Circle c && c.radius() > 10) return "big circle";
8 else if (s instanceof Circle c) return "small circle";
9 else if (s instanceof Square sq) return "square " + sq.side();
10 return "unknown";
11 }
12 public static void main(String[] args) {
13 System.out.println(describe(new Circle(5)));
14 System.out.println(describe(new Square(3)));
15 }
16 }
- A
small circle改行square 3 - B
small circle改行square 3.0 - C
big circle改行square 3.0 - Dコンパイルエラー
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:B✓Gold監修
解説
sealed interface は permits で許可された型だけが実装でき、record は暗黙に final なので
sealed の許可対象として適格(コンパイルは通る)。
instanceof Circle c はパターンマッチング for instanceof(SE16以降で標準)で、束縛変数 c がそのブロック内で使える。
Circle(5) は radius=5 で > 10 でないため「small circle」。
Square(3) は record のアクセサ side() が double を返すため 3.0 となり、
文字列連結で "square " + 3.0 = "square 3.0"。- A
sideはdouble型。3ではなく3.0が連結される。 - Cradius=5 は
> 10を満たさないので「big circle」にならず「small circle」。 - Dsealed+record+instanceofパターンはいずれもJava 17で標準。正しく書かれており、コンパイルは通る。
ひっかけ:
double リテラルは整数値でも 3.0 と表示される(プリミティブ型の連結)。recordアクセサは field() 形式(field ではない)。実機確認の答え合わせ
出力: small circle square 3.0
✓Gold 保有者による書き下ろし解説・実機で検証済