Java 当参数作为泛型ArrayList传递时如何添加<&燃气轮机;

Java 当参数作为泛型ArrayList传递时如何添加<&燃气轮机;,java,generics,collections,Java,Generics,Collections,我有一个函数,它将一个通用的ArrayList作为参数之一,我发现当我尝试使用ArrayList的add方法时出现了一个Java错误 找不到适合添加的方法(MyClass) 我试图完成的是为类和ArrayList传递参数,并让函数用类的对象填充ArrayList。不过,如果我可以从函数中创建并返回ArrayList,那也可以(少一个参数就好了) 以下是一些代码,以说明我目前如何尝试进行此操作: public void myFunction(Class clazz, ArrayList<?&

我有一个函数,它将一个通用的
ArrayList
作为参数之一,我发现当我尝试使用
ArrayList的add方法时出现了一个Java错误

找不到适合添加的方法(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 void myFunction(类clazz,ArrayList myList)
{
对象myObject=null;
请尝试{myObject=clazz.newInstance();}catch(异常e){}
添加(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);
}
public ArrayList myFunction(类clazz)
{
ArrayList myList=新的ArrayList();
对象myObject=null;
请尝试{myObject=clazz.newInstance();}catch(异常e){}
添加(myObject);
}
如果有人可以:

a) 给我看一些执行此操作的代码
b) 解释如何使用泛型实现我的目标

或者c)只需告诉我哪里出了问题,并提供另一种方法

您可以使用
数组列表
,这将允许您将对象添加到列表中。至于,如果没有看到完整的代码,很难说如何使用它

public List<?> myFunction(Class clazz) {
    List<Object> l = new ArrayList<Object>();
    Object o = clazz.newInstance();
    l.add(o);
    return l;
}
公共列表myFunction(类clazz){
列表l=新的ArrayList();
对象o=clazz.newInstance();
l、 添加(o);
返回l;
}

您可以使用
ArrayList
代替,这将允许您将对象添加到列表中。至于,如果没有看到完整的代码,很难说如何使用它

public List<?> myFunction(Class clazz) {
    List<Object> l = new ArrayList<Object>();
    Object o = clazz.newInstance();
    l.add(o);
    return l;
}
公共列表myFunction(类clazz){
列表l=新的ArrayList();
对象o=clazz.newInstance();
l、 添加(o);
返回l;
}

为了向ArrayList添加内容,您需要使其类型定义与ArrayList相反

大概是

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

public void doSomething(…,List为了向ArrayList添加内容,您需要使它的类型定义与ArrayList相反

大概是

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

public void doSomething(…,List您的第一种方法可以固定为:

public <T>
void myFunction(Class<T> clazz, ArrayList<T> myList) {
    T myObject = null;
    try {
        myObject = clazz.newInstance();
    } catch (Exception e) {
    }
    myList.add(myObject);
}
公共
void myFunction(类clazz,ArrayList myList){
T myObject=null;
试一试{
myObject=clazz.newInstance();
}捕获(例外e){
}
添加(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;
}
公共
ArrayList myFunction(类clazz){
ArrayList myList=新的ArrayList();
T myObject=null;
试一试{
myObject=clazz.newInstance();
}捕获(例外e){
}
添加(myObject);
返回myList;
}

这里的
T
称为类型参数。您可以使用任何字母或标识符来代替
T

您的第一种方法可以固定为:

public <T>
void myFunction(Class<T> clazz, ArrayList<T> myList) {
    T myObject = null;
    try {
        myObject = clazz.newInstance();
    } catch (Exception e) {
    }
    myList.add(myObject);
}
公共
void myFunction(类clazz,ArrayList myList){
T myObject=null;
试一试{
myObject=clazz.newInstance();
}捕获(例外e){
}
添加(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;
}
公共
ArrayList myFunction(类clazz){
ArrayList myList=新的ArrayList();
T myObject=null;
试一试{
myObject=clazz.newInstance();
}捕获(例外e){
}
添加(myObject);
返回myList;
}

这里的
T
被称为一个类型参数。你可以使用任何字母或标识符来代替
T

谢谢。我需要数组列表保持通用性,这样当它从函数中出来时,我就可以将它转换为适当的类型。如果是这样,我肯定会发布代码。只是尽量让我的帖子不具体但还是说到点子上。进一步澄清一下:我想知道是否有可能保留传递给函数的列表类型。如果我使用列表作为容器,我以后必须循环列表并强制转换每个对象以获得列表。谢谢。我需要ArrayList保持通用性,以便可以将其强制转换为适当的类型pe。如果是这样的话,我肯定会发布代码。只是尽量让我的帖子不太具体,但还是要切中要害。进一步澄清一下:我想知道是否有可能保留传递给函数的列表类型。如果我要使用列表作为容器,我以后必须p遍历列表并强制转换每个对象以获得我的列表。在这种情况下,T代表类型吗?T是类型的占位符,这使得方法泛型Hanks,我认为这是一条正确的道路。我还没有完全掌握泛型,但我已经做到了。对于泛型,你可能会有很多乐趣,只要记住简单的规则-协方差就可以了从方法调用返回特定的类型,相反,允许您将特定的内容传递到方法调用中。在这种情况下,它不代表类型吗?T是类型的占位符,这使方法泛型化。我认为这是正确的。我对泛型还没有很好的理解,但我已经做到了。有了泛型,您可以做很多事情有趣的是,只要记住简单的规则-协方差就可以让你从方法调用返回特定的类型,而协方差就可以让你将特定的东西传递到方法调用中。谢谢。这正是我需要的。我可以按照你提供的方法重新编写代码。谢谢。这正是我需要的。我可以重新编写我的c按照您提供的方法进行ode。