• 締切済み

ジェネリクスの型パラメータについて

<T extends Super> <? extends Super> このときのTと?を使用した違いはあるのでしょうか?

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.4

その二つが使われる場所と効果の違いは、以下のようなことだと思います。 class template<T extends Object> extends Object { private T Param; public template() { super(); }; public void SetPrintParam(T arg) { Param = arg; System.out.println(toString() + ":" + arg.toString()); }; } public class generics { public static template<? extends Object> Dist1; public static template<String> Dist2; public static void main(String args[]) { template<String> Source1 = new template<String>(); template<Integer> Source2 = new template<Integer>(); Dist1 = Source1; ((template<String>)Dist1).SetPrintParam(new String("abcdefg"));//警告が出る Dist1 = Source2; ((template<Integer>)Dist1).SetPrintParam(new Integer(100));//警告が出る Dist2 = Source1; Dist2.SetPrintParam(new String("1234567")); // Dist2 = Source2;コンパイル時にエラーになる }; }

回答No.3

<T extends Super> 主に、独自のジェネリックスクラスを定義する際に、「型パラメータの制約」(正確には、境界[bound])を使用したものですね。この場合の型引数では、Superクラスか、又はそのサブクラスしか指定出来ません。 Java言語機能(JDK5.0(Tiger)新機能) 1章 ジェネリクス 1.3. 型引数 http://www.techscore.com/tech/J2SE/JavaLanguage/1-3.html ちなみに、独自ジェネリックスでは、「?」や「super」は使用不可です。 <? extends Super> ワイルドカードを用いて、ジェネリックスの継承を利用したものですね。これを指定した変数には、Superクラスか、又はそのサブクラス以下のコレクションが使用可能となります。(但し、要素の追加は不可。) ジェネリック: Java vs C# ワイルドカード型アーギュメント http://homepage2.nifty.com/magicant/programmingmemo/genericsjavavscs.html

回答No.2

<? extends Super>はCollection系クラスがどんな型を配列要素として格納できるかを表すものだったような気がします。 下のURLのブログでは、具体的に例が示されていますので、参考までに。でも、実際自分はこの考え方がよく分からなくて困ってます・・。理解できたら分かりやすく教えてください。

参考URL:
http://blogs.wankuma.com/nagise/archive/2007/08/04/88855.aspx
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

Tは、 public T amethod(){ } などのようにタイプパラメータとして使えますが、?は使えません。