見出し画像

Effective Java(3rd) Item 26 Don't use raw types

P117
 
Java5から、ジェネリクスは言語の一部になった。それ以前は、全てのオブジェクトをコレクションからキャストしなければならなかった。誰かが誤って違う型のオブジェクトを挿入したら、キャストは実行時にエラーとなるだろう。ジェネリクスを使えば、それぞれのコレクションでオブジェクトのどの型が許されるかをコンパイラに教えることができる。コンパイラは自動的にキャストを挿入し、間違った型のオブジェクトを挿入しようとしたらコンパイル時に教えてくれる。その結果、プログラムはより安全で明確なものになるが、コレクションに限らずこの利点は高くつく。この章では利点を最大にし、欠点を最小化する方法を教える。

まず、いくつか用語から。一つ以上の型引数をもつ宣言があるクラスやインタフェースはジェネリッククラスやジェネリックインタフェースと呼ぶ。例えば、Listインタフェースは要素型(element type)を表す、一つの型引数Eを持っている。インタフェースのフルネームはList<E>(Eのリストと読む)であるが、よく略されてリストと呼ばれる。ジェネリッククラスやジェネリックインタフェースはそれぞれ総称型(generic types)として知られている。

各総称型は引数の型の組み合わせを定義する。これは総称型の仮型引数に対して実型引数のカッコ付きリストが続くクラスやインタフェースの名前からなる。例えば、List<String>(Stringのリスト)はString型の要素からなるリストを表す、パラメータ化された型(parametrized types)である(Stringは仮型引数Eに対応した、実型引数である)。

最後に、各総称型は型引数を一つも持たない総称型である、raw typeを定義する。例えば、List<E>に対応したraw typeはListである。raw typesは型の宣言から全ての総称型の情報があたかも消えてしまったかのように振る舞う。それらは主にジェネリクス無しのコードとの互換性のためにある。

P118
 
ジェネリクスがJavaに加わる前、これは模範的なコレクションの宣言であった。Java9になった時、これは依然として合法的であるが、模範的とはいえない。

// Raw collection type - don't do this!
 
// My stamp collection. Contains only Stamp instances.
private final Collection stamps = … ;


この記事が気に入ったらサポートをしてみませんか?