継承を使ったジェネリクス
<T extends Number>
ワイルドカードを使ったジェネリクス
<? extends Number> 両方とも、「Number又は、Numberのサブクラス」という意味だと思うのですが 何が違うのでしょうか? 学習をはじめたばかりで、両方とも同じ意味に見えてしまいます。気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
見て分かる通り、<T extends Number>
にはT
という型が現れていますが、<? extends Number>
には型がありません。2つにはそれぞれ違った意味があります。
Example<T extends Number>
…T
にはNumber
自身、あるいはそれを基底クラスに持つ具体的な型を指定する。この場合、Example<Number>
とExample<Integer>
は別の型扱いとなり、互いに交換できない。Example<? extends Number>
の場合、?
にはNumber
自身を含め任意のクラスをもってくることができる(Example<? extends Number>
で宣言した変数にExample<Number>
とExample<Integer>
どちらでも代入できる)。そのかわりに、引数に型パラメータが現れるようなメソッドは呼べない(?
なので型が決まらない)。
投稿2018/04/16 04:33
総合スコア145183
0
ベストアンサー
役割が異なります。
そもそもジェネリクスは、あるクラスで扱う型を統一することによって型安全を保とうとする仕組みです。
List<Number>
のように使うと、この型で宣言されたListはNumber型かその子の型のみ入れることができ、出すときもNumber型として取り出せます。これは、List
の定義がList<E>
となっており、addメソッドの引数型やgetメソッドの返り値型がEとして宣言されているからです。
<T extends Number>
は、その扱う型をNumberかその子の型だけに限定しようという仕組みで、クラスやメソッドの定義時に使われます。
一方、ワイルドカードはそのジェネリクスの部分を「なんでもいい」状態にするものです。
<? extends Number>
のような使い方は、「Numberかその子なら何でもいい」という言い方です。
java
1// ジェネリクスやワイルドカードの使い方例(コードは超適当です) 2class A<E extends Number> { // クラスのジェネリクス宣言 ここで?は使えない 3 List<E> list1; //クラスでジェネリクス宣言したEを型として使える 4 List<? extends Number> list2; //List<Number>やList<Integer>などを入れられる 5 6 // メソッドで使用する型の名前としてTを使う 7 // 引数のSetで扱う型はどうでもいい 8 public <T extends Number> T method (Set<? extends Number> set) { 9 10 } 11}
投稿2018/04/16 15:36
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/17 13:22