Effective Java 第3版を読んだので、本書で紹介されていた全90項目のプラクティスを簡潔にまとめる。
https://www.maruzen-publishing.co.jp/item/?book_no=303408

本記事は第5章「ジェネリクス」の項目について記載する。

第5章 ジェネリクス

一つ以上の型パラメータを宣言に持つクラスやインタフェースは、ジェネリッククラスやジェネリックインタフェースと呼ぶ。

項目26 原型を使わない

原型とは型パラメータなしのジェネリック型のことをいう。

原型を使うと、ジェネリックスの安全性と表現力のすべてを失うため、原型を使うべきでない。

また、原型を使うと実行時に例外がスローされる可能性がある。

項目27 無検査警告を取り除く

ジェネリックスを使うとコンパイラの警告に直面することがある。

多くの無検査を取り除くのは簡単である。
しかし、警告によっていは取り除くのが難しいものもある。

そういった警告に対して、@SuppressWarnings("unchecked")アノテーションにより警告 を抑制させる。
ただし、警告が発生しているコードが型安全だと示すことができる場合に限る。

SuppressWarningsアノテーションを指定するのは、最小のスコープにすること。
クラス全体に指定しないこと。

また、警告を抑制する理由をコメントアウトしておくこと。

項目28 配列よりもリストを選ぶ

配列とリスト(ジェネリックス)は異なる型規則を持っている。

配列は実行時の型安全性を提供するが、コンパイル時の型安全性は提供しない。
ジェネリックスはその逆。

コンパイル時に検知できるほうが良いので、リストを使うべきである。

項目29 ジェネリック型を使う

ジェネリック型は、クライアントのコードでキャストが必要である型より、安全で使いやすい。

新たな型を設計するときには、クライアントのコードでキャストが不変であることを確認すること。

項目30 ジェネリックメソッドを使う

メソッドを型安全にするには、型パラメータを宣言するようにメソッドを修正して、メソッド内でその型パラメータを使うようにする。

public static <E> Set<E> hoge(Set<E> set1, Set<E> set2) {
    Set<E> resultSet = new HashSet<>(set1);
    return resultSet.addAll(set2);
}   

項目31 APIの柔軟性向上のために境界ワイルドカードを使う

項目32 ジェネリックスと可変長引数に注意して組み合わせる

項目33 型安全な異種コンテナを検討する