如何将参数作为Generic ArrayList <! - ? - >传递时添加

时间:2012-10-07 14:16:35

标签: java generics collections

我有一个函数,它将泛型ArrayList<?>作为参数之一,我发现当我尝试使用ArrayList <的add方法时出现Java错误/ p>

  

找不到合适的添加方法(MyClass)

我想要完成的是为Class和ArrayList传递参数,并让函数使用Class的对象填充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)让我知道我哪里出错并提供另一种方式

3 个答案:

答案 0 :(得分:4)

为了向ArrayList添加内容,你需要使它的类型定义逆变。

类似

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

会起作用。

答案 1 :(得分:1)

您可以改用ArrayList<Object>,这样您就可以在列表中添加对象了。至于generics,很难说如何在不看完整个代码的情况下使用它。

public List<?> myFunction(Class clazz) {
    List<Object> l = new ArrayList<Object>();
    Object o = clazz.newInstance();
    l.add(o);
    return l;
}

答案 2 :(得分:1)

您的第一种方法可以修复为:

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