1Z0-826-JPN 対応
関数型(プリミティブ特化)難易度 高無料

次のコードの出力として正しいものを選べ。

1   import java.util.function.*;
2   public class Q9 {
3       public static void main(String[] a) {
4           IntFunction<String> f = i -> "n" + i;
5           ToIntFunction<String> g = String::length;
6           Supplier<Integer> s = () -> 42;
7           System.out.println(f.apply(7));
8           System.out.println(g.applyAsInt("hello"));
9           System.out.println(s.get() + 1);
10      }
11  }
  1. An7 改行 5 改行 43
  2. Bn7 改行 5 改行 42
  3. Cコンパイルエラー:IntFunction に apply は無く applyAsInt が正しい。
  4. Dコンパイルエラー:ToIntFunction に applyAsInt は無く apply が正しい。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓有資格者監修

解説

プリミティブ特化の関数型インタフェースは、「どこがプリミティブか(入力か/出力か)」で抽象メソッド名が決まる。これを正確に区別できるかがこの問題の核心。

  • IntFunction<R>:入力が int、出力が参照型 R。抽象メソッドは R apply(int)。
    f.apply(7) → "n" + 7 = n7。
  • ToIntFunction<T>:入力が参照型 T、出力が int。抽象メソッドは int applyAsInt(T)。
    g.applyAsInt("hello") → "hello".length() = 5。
  • Supplier<Integer>:抽象メソッドは Integer get()。
    s.get() = Integer の 42。+ 1 で自動アンボクシングされ 43。

原則:「To〜」が付く型は出力がプリミティブ=applyAsXxx/「〜Function」で入力だけプリミティブなら apply(戻りは参照型 R)。

各誤答が違う理由
  • Bs.get() は Integer 42。+ 1 でアンボクシングされ 43 になる(42 のままにはならない)。
  • CIntFunction の抽象メソッドは apply(int) で正しい。applyAsInt を持つのは「出力が int」の ToIntFunction 等。よってコンパイルは通る。
  • DToIntFunction の抽象メソッドは applyAsInt(T) で正しい。出力が int だから applyAsInt。コンパイルは通る。
ひっかけ: 「Int が付くから全部 applyAsInt」と短絡する。プリミティブが“出力側”のときだけ applyAsInt。入力だけ int の IntFunction は戻りが参照型なので普通の apply。さらに Supplier<Integer> は get()(getAsInt() は IntSupplier の方)。
実機確認の答え合わせ
出力:
n7
5
43
✓有資格者(著者)による書き下ろし解説

有資格者(著者)が監修した問題は、すべて無料サンプルとして公開しています。買う前に、その全部を実際に解いて解説まで読めます。有料で追加される問題はAIが作成したもので、有資格者の監修は入っていません。

この問題集の作り方

  1. 問題と解説はAIが作成しています。有資格者(著者)が監修した問題は、無料サンプルとして公開している分だけです。有料で追加される問題に監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 解説に載せているコンパイル結果は、実際に javac を走らせた出力です。想定した挙動ではありません。
  5. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  6. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
関数型インタフェース を含む問題を分野別に演習できます。
演習する →