項目23は、(新しいコードでは、生の型を使用しないでください)効果的なジャワのそれは次のような方法は危険と安全ではないことを主張し、Javaコードで生タイプを使用すると、常に例えば生の型は常に悪いですか?
危険であることを主張し
// Use of raw type for unknown element type - don't do this!
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
s1とs2で書き込み操作やクラスキャスト操作を行うと、すべての種類の例外が発生することがありますが、上記の方法が安全でない理由を理解できません。著者Joshua Blochは次の方法を代わりに推奨しています。言い換えれば
// Unbounded wildcard type - typesafe and flexible
static int numElementsInCommon(Set<?> s1, Set<?> s2){
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
、この方法が唯一のObject.classをの方法を使用し、渡されたパラメータへの変更をしない場合は、なぜそれが悪いのですか?
昔、ジェネリックスの前に、人々はその日のコレクション(すなわち、その時代のコレクションではなかった 'Hashtable'と' Vector')で**タイプをミックスしました。これは '[0、" abc "、Date]'のようなものにつながりました。これはハックです(Javaでは独自のデータ型を作成できるので)。 'Set >'では、一貫した要素タイプが保証されています。 –
確かに。私の質問は、** Object.Classによって公開されたメソッドのみを含む読み取り専用のメソッドや操作の場合、生の型が安全でないことです** ** –
いいえ、そうではありません。実行時には、すべての型は生のままであり、ワイルドカードで推奨されるメソッドと全く同じことを行います。しかし、この方法では、コンパイラは、あなたが実際にこれらの「安全なもの」以外の何かをしないことをチェックします。ワイルドカードがなければ、誤ってセットに追加した場合など、エラーは発生しません。だから知っていればジェネリック型、そうでなければワイルドカードを使ってください。生の型は使用しないでください。 – Thilo