対策する資格
Java Silver ・ 近日ORACLE Silver ・ 近日
Gold 保有者 監修1Z0-829 対応
関数型(プリミティブ特化)難易度 高無料

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

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コンパイルエラー:IntFunctionapply は無く applyAsInt が正しい。
  4. Dコンパイルエラー:ToIntFunctionapplyAsInt は無く apply が正しい。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AGold監修

解説

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

  • IntFunction<R>入力が int、出力が参照型 R。抽象メソッドは R apply(int)
    f.apply(7)"n" + 7n7
  • 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
Gold 保有者による書き下ろし解説・実機で検証済
この分野をもっと解いて、得点源に
関数型インタフェース を含む全問を分野別に演習できます(無料)。
演習する →