対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
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  }
  1. Asmall circle 改行 square 3
  2. Bsmall circle 改行 square 3.0
  3. Cbig circle 改行 square 3.0
  4. Dコンパイルエラー
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:BGold監修

解説

sealed interfacepermits で許可された型だけが実装でき、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"
各誤答が違う理由
  • Asidedouble 型。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 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
record / sealed を含む全問を分野別に演習できます(無料)。
演習する →