1

パラメータの 1 つとしてジェネリックを受け取る関数があり、その関数ArrayList<?>の add メソッドを使用しようとすると Java エラーが発生することがわかりました。ArrayList

add(MyClass) に適したメソッドが見つかりません

私が達成しようとしているのは、クラスとArrayListのパラメーターを渡し、関数にクラスのオブジェクトをArrayListに入力させることです。代わりに、関数から ArrayList を作成して返すことができれば、それも問題ありません (パラメーターが 1 つ少ないとよいでしょう)。

これは、私が現在これをどのように行おうとしているのかを示すコードです。

public void myFunction(Class clazz, ArrayList<?> myList)
{
  Object myObject=null;
  try{myObject = clazz.newInstance();}catch(Exception e){}      
  myList.add(myObject);
}

...または多分このようなもの:

public ArrayList<?> myFunction(Class clazz)
{
  ArrayList<clazz> myList = new ArrayList<clazz>();
  Object myObject=null;
  try{myObject = clazz.newInstance();}catch(Exception e){}      
  myList.add(myObject);
}

誰かがお願いできれば:

a) これを行うコードをいくつか示してください
b) Generics を使用して目標を達成する方法を説明して
ください または c) どこが間違っているのかを教えて、別の方法を提供してください

4

3 に答える 3

4

ArrayList に何かを追加するには、その型定義を反変にする必要があります。

だから何か

public <T> void doSomething(...,List<? super T> args,...) 

動作します。

于 2012-10-07T14:31:47.813 に答える
2

最初の方法は次のように修正できます。

public <T>
void myFunction(Class<T> clazz, ArrayList<T> myList) {
    T myObject = null;
    try {
        myObject = clazz.newInstance();
    } catch (Exception e) {
    }
    myList.add(myObject);
}

2つ目は次のとおりです。

public <T>
ArrayList<T> myFunction(Class<T> clazz) {
    ArrayList<T> myList = new ArrayList<T>();
    T myObject = null;
    try {
        myObject = clazz.newInstance();
    } catch (Exception e) {
    }
    myList.add(myObject);
    return myList;
}

Tこれを型パラメータと呼びます。の代わりに任意の文字または識別子を使用できますT

于 2012-10-07T14:36:03.380 に答える
1

代わりにを使用ArrayList<Object>できます。これにより、オブジェクトをリストに追加できます。genericsに関しては、コード全体を見ずにどのように使用するかを言うのは困難です。

public List<?> myFunction(Class clazz) {
    List<Object> l = new ArrayList<Object>();
    Object o = clazz.newInstance();
    l.add(o);
    return l;
}
于 2012-10-07T14:18:49.940 に答える