関数型(プリミティブ特化)難易度 高無料
次のコードの出力として正しいものを選べ。
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 }- A
n7改行5改行43 - B
n7改行5改行42 - Cコンパイルエラー:
IntFunctionにapplyは無くapplyAsIntが正しい。 - Dコンパイルエラー:
ToIntFunctionにapplyAsIntは無くapplyが正しい。
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:A✓Gold監修
解説
プリミティブ特化の関数型インタフェースは、「どこがプリミティブか(入力か/出力か)」で抽象メソッド名が決まる。これを正確に区別できるかがこの問題の核心。
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)。
- B
s.get()はInteger42。+ 1でアンボクシングされ 43 になる(42 のままにはならない)。 - C
IntFunctionの抽象メソッドはapply(int)で正しい。applyAsIntを持つのは「出力が int」のToIntFunction等。よってコンパイルは通る。 - D
ToIntFunctionの抽象メソッドはapplyAsInt(T)で正しい。出力が int だからapplyAsInt。コンパイルは通る。
ひっかけ: 「Int が付くから全部
applyAsInt」と短絡する。プリミティブが“出力側”のときだけ applyAsInt。入力だけ int の IntFunction は戻りが参照型なので普通の apply。さらに Supplier<Integer> は get()(getAsInt() は IntSupplier の方)。実機確認の答え合わせ
出力: n7 5 43
公式ドキュメント・関連IntFunction<R>.apply(int)↗ToIntFunction<T>.applyAsInt(T)↗java.util.function パッケージ概要↗
✓Gold 保有者による書き下ろし解説・実機で検証済