1

我有一个将泛型ArrayList<?>作为参数之一的函数,我发现当我尝试使用ArrayList

没有找到适合 add(MyClass) 的方法

我想要完成的是传递类和 ArrayList 的参数,并让函数用类的对象填充 ArrayList。虽然如果我可以从我的函数中创建并返回 ArrayList,那也很好(少一个参数会很好)。

这里有一些代码来说明我目前正在尝试如何解决这个问题:

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) 解释如何使用泛型来实现我的目标
或 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);
}

第二个为:

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

您可以改用 an ArrayList<Object>,这将允许您将对象添加到列表中。至于泛型,如果没有看到整个代码,就很难说你是如​​何使用它的。

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 回答