• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ワイルドカード<?>と型パラメータ<T>の違いがすっきりしない。)

ワイルドカード<?>と型パラメータ<T>の違いがすっきりしない

このQ&Aのポイント
  • Java初心者がワイルドカード<?>と型パラメータ<T>の違いを理解するのが難しい
  • <T>と<?>の使い分けがわからない
  • ワイルドカード<?>と型パラメータ<T>の使い方について教えてほしい

質問者が選んだベストアンサー

  • ベストアンサー
  • ketuago65
  • ベストアンサー率50% (13/26)
回答No.1

<T>とか<E>というのはジェネリックスのクラスやメソッドを宣言する時に使うもので、 ワイルドカードの<?>は引数や変数、戻り値型などの参照の宣言にしか使えません。 つまり上のコードで言えば、 class WildCardSample1<T>{ のかわりに class WildCardSample1<?>{ のようなコードは書くことができないということです。 <?>は単に任意の型を代入できますということをあらわしているだけです。 List<?> l = new ArrayList<String>(); は出来ますが、 List<T> l = new ArrayList<String>(); は出来ません。 Tは何のクラスになるか分からないので、Stringではエラーになります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

List を例にして、よく見る Generics のパターンを整理すると↓こんな感じになります。 ■ List<String>   → 文字列の格納が出来るリスト。  入れられるもの : 文字列(String)とnull  取出されるもの : 文字列(String)かnull ■ List<Object>   → どんな型のオブジェクトの格納も出来るリスト。  入れられるもの : 任意の型のオブジェクトとnull  取出されるもの : Object型のオブジェクト(=任意の型のインスタンス)かnull ■ List<?>   → 何かの型のオブジェクトの格納が出来るリスト。その型が何かは分からない。  入れられるもの : null (入れられる型が分からないため)  取出されるもの : Object型のオブジェクト(=何かの型のインスタンス)かnull ■ List<T>   → T型のオブジェクトの格納が出来るリスト。Tはそれぞれのクラス宣言・メソッド宣言で指定される。(コンパイラが判断できる場合は暗黙に指定される場合も有る)  入れられるもの : T型のオブジェクトとnull  取出されるもの : T型のオブジェクトかnull 下記の様に渡された WildCardSample オブジェクトから type を取出して返すメソッドを考えます。 ---------------------------------------------- class WildCardSample1Main2{ static <T> T getType1(WildCardSample<T> w){ return w.getType(); } static Object getType2(WildCardSample<?> w){ return w.getType(); } public static void main(String[] args){ String typeStr1 = getType1(new WildCardSample<String>("Tiger")); Double typeDouble1 = getType1(new WildCardSample<Double>(5.0)); Object typeStr2 = getType2(new WildCardSample<String>("Tiger")); Object typeDouble2 = getType2(new WildCardSample<Double>(5.0)); } } ---------------------------------------------- getType1 では引数の宣言が <T> なので、そのT型のオブジェクトを返せます。 getType2 では引数の宣言が <?> になっているため Object 型のオブジェクトを返すしか有りません。 getType1 の戻り値は、 main 内でキャストしなくても、String や Double 型の変数に代入できています。 下記のページも参考になると思います。 http://www.ibm.com/developerworks/jp/java/library/j-jtp04298.html http://www.ibm.com/developerworks/jp/java/library/j-jtp07018.html http://www.ibm.com/developerworks/jp/java/library/j-jtp01255/

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コンパイルできません

    Javaを独習中の、初心者です。何方か、教えてください。 或る入門書で、「メソッドのパラメター化」との項目の中に、下記 サンプルプログラムが載っておりまして、その通りに、入力実行しましたが、「Generics.java:5: ';'がありません。return T.toString() data;」とのエラーメッセージが表示され、試行錯誤してみましたが、解りません。何処が、エラーなのかお教え頂ければ幸いです。 1 import java.util.Data; 2 3 class Generics { 4 public static <T> String geneMethod( T data ) { 5 return T.toString() data; 6 } 7 8 public static void main( String[] args ) { 9 String str = 10 Generics.<String>geneMethod("aaa"); 11 System.out.println( str); 12 Data data = 13 Generics.<Data>geneMethod( new Data()); 14 System.out.println( data ); 15 } 16 } 以上、宜しくお願い致します。  

    • ベストアンサー
    • Java
  • mainクラスのpublicの意味を教えて下さい

     お早う御座います、JAVA初心者です、宜しくお願いします。  main クラスの public をコメントアウトしてもエラーもなく走ります。  これは、「public static void main(String[] args)」を持っているクラスを自動的に「main クラス」と判断しているということでしょうか。 ============================================================ class Sub { void disp() { System.out.println(" a "); } } /*public*/ class Main { public static void main(String[] args) { Sub s = new Sub(); s.disp(); } }

    • ベストアンサー
    • Java
  • Genericsの型パラメータ

    Genericsについて質問します。既存のクラスにGenericsをつけるとエラーになってしまい困っています。 A、Bという抽象クラスがあり、互いに互いのサブクラスを限定したいフィールドを持つという前提で下記のようなコードを考えました。 が、b.setA(this);で 制約の不一致:型TのメソッドsetB(?)は引数(B<T>)に適用できません。 というエラーが発生してしまいます。(Bクラスも同様) その通りに、Bクラスの?をAに変えると警告が発生してしまい、さらに<?>を追加するとやっとなくなり、Aクラスも同様に修正すると両方ともクラスのパラメータ部でエラーが発生してしまいます。 Genericsを使用した解決策を教えてください。お願いします。 pakcage sample; public abstract class A<T extends B<?>> { private T b; public void setB(T b){ this.b = b; if(b.getA() == null){ b.setA(this); } } } pakcage sample; public abstract class B<T extends A<?> { private T a; protected void setA(T a){ this.a = a; a.setB(this); } protected T getA(){ return this.a; } }

    • ベストアンサー
    • Java
  • mainクラス内に書いたメソッドの宣言の仕方(staticの必要性)

    java を勉強中の超初心者です、宜しくお願いします。 main と同じクラスに disp というメソッドを作成してやり、” void disp(int a , int b )”と書いてやりましたが、mainからアクセス出来ません。 そこで、” static void disp(int a , int b )” という風に” static ” を先頭につけてやりましたら、うまく動きました。 これは、mainメソッドから他のメソッドにアクセスする場合には、必ず” static ” をつけてやる必要があるということでしょうか。 ======================================================= class クラス練習 { public static void main(String[] args) { disp(5,10); } /*static*/ void disp(int a , int b ) { System.out.println("a+b = " + (a+b)); } }

    • ベストアンサー
    • Java
  • Javaのプログラムについて教えてください!

    Genericsを使ってエラーの出ないようにするにはどうすればいいですか? import java.util.*; public class Sample{ public static void main(String[] args){ ArrayList ary = new ArrayList(); ary.add("Mac"); ary.add("Wiindows"); ary.add("Linux"); for(Object str:ary){ System.out.println((String)str); } } }

    • ベストアンサー
    • Java
  • 「型 ArrayList は総称ではありません・・・。」エラーについての問題です。

    コンニチハ、javaの初心者s-unです。 Eclipse(Ver:3.1.1)でJavaのプログラムを書いています。 *********************************** import java.util.ArrayList; class collectionTest1{ public static void main(String args[]){ ArrayList<String> array = new ArrayList<String>(); } } *********************************** エラーメッセージは 「型 ArrayList は総称ではありません。引数 <String> でパラメーター化できません。」 JDK準拠>>コンパイラー準拠レベル5.0になっています。 原因をお教え頂けますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • Java
  • 初歩的な質問ですみません。

    はじめまして。Javaの初心者です。 初歩的なことで、どうしてもわからないことがあります。 以下のような場合、 *************************************** class Oya { void func() { System.out.println("Oya"); } } class Ko extends Oya { Ko() { this.func(); } } class Main { public static void main(String[] args) { new Ko(); } } *************************************** Koクラスが初期化を完了していないのにもかかわらず func()メソッドを呼びさせてしまう理由がわかりません。なぜなのでしょうか?どうか教えてください。

    • ベストアンサー
    • Java
  • C++で、クラスの受け渡しを行いたい

    C++を現在勉強中です。 java は少しだけわかるのですが、 以下のjavaのコードをC++で実現する方法が わかりません。 ------------------------------------------- class test2 { private test2() { } public test2(String hoge) { } } class test1 { private void method1(test2 t2) { } public static void main(String[] args) { test1 t1 = new test1(); } } ------------------------------------------- ようは、test2クラスのデフォルトコンストラクタを不可視にしておきながら、呼び出し側でどのように定義すればよいのかがわかりません。 どなたか回答お願いします。

  • 実行の順番を教えてください。

    現在JAVAの学習をおこなっていて、参考書で勉強しています。 しかし、以下の3つのソースコードはどの順番で実行されているか理解できておりません。 すみませんが、実行の順番を教えて頂けないでしょうか。 実行の順に数字を振ったりしていただけますと特に嬉しいです。 お願いします。 ※サンプル1 class testA{ testB b; testA(){ b=new testB(this); } } class testB{ testA a; testB(testA a){ this.a=a; } } class testAll{ public static void main(String args[]){ new testAll().banana(); //ソースコード } void banana(){ testA test = new testA(); } } ※サンプル2 public class A{ public static void apple(Integer i){ int ta =i.intValue(); ta+=3 ; i=new Integer(ta); } public static void main(String args[]){ Integer i = new Integer (0); apple(i); System.out.println(i.intValue()); } } ※サンプル3 public class Test{ public static void main (String args[]){ class orange{ public int i =9; } Object o=(Object)new orange(); orange orange = (orange)o; System.out.println("i="+orange.i); } }

    • ベストアンサー
    • Java
  • Javaについて教えてください!

    sampleパッケージに属するMain.javaとSub.javaがあり、Main.javaのmainはSub.javaのsubメソッドを呼び出して「OK」と表示させるプログラムを教えてください! //Main.java package sample; public class Main{ public static void main(String[] args){ Sub.sub(); }} //Sub.java package sample; public class Sub{ static String str = "OK"; public static void sub(){ System.out.println(str); }} String型の変数strはクラス変数で行いたいのですが、どこを改善すれば良いでしょうか?

    • ベストアンサー
    • Java