wrongwrongな開発日記

しんまいさんの忘備録

【Java】引数のListに対するStream処理がコンパイルできない状況への対処

以下のコードは、Listを内容のクラスの名前の配列にして返すという内容です。
List内の型に関係なく実行できるコードであるため、一見正しいように見えますが、このコードはコンパイルできません。

String[] toNameArray(List list) {
    return list.stream().map(it -> it.getClass().getName()).toArray(String[]::new);
}

対処

以下のように、ジェネリクスで「何でも取る」ということを明示すれば解決できます。

String[] toNameArray(List<?> list) {
    return list.stream().map(it -> it.getClass().getName()).toArray(String[]::new);
}
補足

例え「ジェネリクスに全く影響されずに実行できるコード」であっても、それを明示するジェネリクスを書かなければ警告やコンパイルエラーとなります。
つまり、「何が指定されていても構わない」という場合は<?>ジェネリクスとして指定しなければならないということです。

おまけ

Qiitaに投稿した、この例を含むジェネリクス関連の記事です。
qiita.com