0

私はjdk 1.6を使用しています
私の主な方法:

exmp3<String , Integer> exmp3 = new exmp3( "ravi" , new ArrayList<String>());
                exmp3.put(5);
                exmp3.put(15);
                exmp3.put(20);
                ArrayList<Integer> a =  exmp3.getObject();
                System.out.println(a.size());

クラス exmp3 :

public class exmp3<ABC , XYZ>
{
    private ABC abc ;
    private ArrayList<XYZ> xyz;

        public exmp3(ABC abc , ArrayList<XYZ> xyz)
        {
            this.xyz =  xyz;
        }

        public void put(int i)
        {
            ArrayList<Integer> a =  (ArrayList<Integer>) this.xyz;
            a.add(i);
        }

        public ArrayList<XYZ> getObject()
        {
            return xyz;
        }
    }

私のクエリは、exmp3inメソッドのインスタンスを作成しているときに、メソッドで述べたように、whereのパラメトリック型として受け入れられるmain理由です。StringArrayListexmp3<String , Integer> exmp3main

4

3 に答える 3

4

コンストラクター呼び出しの型引数を指定していないためです。それらを明示的に指定するか(new exmp3<String, Integer>(...))、コンパイラにそれらを理解させる(new exmp3<>(...)、JDK7 +が必要)。

于 2012-06-13T12:19:42.360 に答える
3

生のタイプを使用しているためです。new exmp3(..)タイプ情報が無視されることを意味します。これを次のように変更します:new Exmp3<String, Integer>(Java 5-6)またはnew Exmp3<>(Java 7)

この場合、コンパイラは通常、raw型を使用してはならないという警告を表示します。つまり、raw型を使用する場合、1.5より前のJavaとして機能します。つまり、ジェネリックはありません。

于 2012-06-13T12:18:57.337 に答える
1

これを使用しているため:

new exmp3( "ravi" , new ArrayList<String>());

これはほとんど同じです

new exmp3<Object,Object>( "ravi" , new ArrayList<String>());

メソッドまたはコンストラクターの引数は、インスタンス化するときに型を定義することはありません。コンパイラは(消去について考えていない場合)のみを認識します:

new exmp3( String , ArrayList);

インスタンスがこの定義を使用するように宣言されている間:

public class exmp3<Object, Object>
{
    private Object abc ;
    private ArrayList<Object> xyz;

        public exmp3(Object abc , ArrayList<Object> xyz)
        {
            this.xyz =  xyz;
        }

        public void put(int i)
        {
            ArrayList<Integer> a =  (ArrayList<Integer>) this.xyz;
            a.add(i);
        }

        public ArrayList<Object> getObject()
        {
            return xyz;
        }
    }
于 2012-06-13T12:28:50.267 に答える