ログイン
検索
メインメニュー
ブログ一覧
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のみ追加することができます。

つまり、ジェネリクスを使う時、クラスはテンプレートクラスでなければなりません。もしそのクラスがスーパータイプとしてテンプレートパラメタを使いたければ、自分自身のテンプレートパラメタにスーパーテンプレートパラメタをバインドしておく必要があります。
投稿する
コメント投稿に関するルール登録ユーザ以外のコメントは承認が必要
表題
投稿者
アイコン
コメントurl email imgsrc image code quote
サンプル
bold italic underline linethrough   


 [もっと...]
オプション顔アイコンを有効にする
XOOPSコードを有効にする
改行を自動挿入する