Re: バウンドクラス |
投稿者: harry 投稿日時: 2008-1-11 13:19:22 hiraさん、コメントありがとうございました。 > Eという型名が、「仮引数」として使われているのがテンプレートクラス(たとえば AbstactList)であり、 > 「実引数」として実体が埋められた状態すなわちバインドされた状態(たとえば AstractList<String>)が、 > バウンドクラスという理解でいいのかな? はい、そのとおりです。 > そうすると、上記 ArrayList の例で、中間層の2つがバウンドでありながら、 > 最下層の ArrayList がパラメタライズドである(いったんバインドされたのに、 > 再度仮引数が出てくる)というのはどういうわけなんでしょう? 上記の図で、左側のUMLのクラス図と右側のJavaソースコードを比べてみてください。 "List1"はテンプレートパラメタが設定されていません。そのため、"List1"にジェネリクスを使うことはできません。また、"List1<String>"は正しくありません。 "List2"の"E"は"ArrayList"の"E"と無関係なので、"List<String>"にどんなオブジェクトでも追加することができます。 "List3"はテンプレートパラメタが設定されていません。そのため、"List3"にジェネリクスを使うことはできません。また、"List3<String>"は正しくありません。 "List4"の"E"は"ArrayList"の"E"にバウンドされています。そのため、"List4<String>" にはStringのみ追加することができます。 つまり、ジェネリクスを使う時、クラスはテンプレートクラスでなければなりません。もしそのクラスがスーパータイプとしてテンプレートパラメタを使いたければ、自分自身のテンプレートパラメタにスーパーテンプレートパラメタをバインドしておく必要があります。 |