我有一个函数,它将泛型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)让我知道我哪里出错并提供另一种方式
答案 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
。