【问题标题】:How to add when argument is passed as Generic ArrayList<?>当参数作为 Generic ArrayList<?> 传递时如何添加
【发布时间】:2012-10-07 23:03:54
【问题描述】:

我有一个函数,它采用通用 ArrayList&lt;?&gt; 作为参数之一,我发现当我尝试使用 ArrayList 的 add 方法时出现 Java 错误

没有找到适合 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) 让我知道哪里出错并提供替代方法

【问题讨论】:

    标签: java generics collections


    【解决方案1】:

    为了给 ArrayList 添加一些东西,你需要使它的类型定义逆变。

    类似

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

    会起作用的。

    【讨论】:

    • 在这种情况下T代表Type吗?
    • T 是类型的占位符,这使得方法通用
    • 谢谢,我认为这是正确的道路。我还没有牢牢掌握泛型,但我已经掌握了。
    • 使用泛型你可能会得到很多乐趣,只要记住简单的规则——协变允许你返回特定类型 from 方法调用,而逆变允许你传递特定的东西 进入方法调用。
    【解决方案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

    【讨论】:

    • 谢谢。这正是我需要的。按照您提供的方法,我能够重新编写我的代码。
    【解决方案3】:

    您可以改用ArrayList&lt;Object&gt;,这将允许您将对象添加到您的列表中。至于generics,如果没有看到完整的代码,很难说你是如​​何使用它的。

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

    【讨论】:

    • 谢谢。我需要 ArrayList 保持通用,以便当它从函数中出来时我可以将它转换为适当的类型。
    • 如果是这样,我一定会发布代码。只是试图让我的帖子尽可能不具体,但仍然是重点。
    • 进一步澄清:我想知道是否可以保留传递给函数的 List 类型。如果我要使用 List 作为容器,我将不得不稍后遍历 List 并强制转换每个对象以获取我的 List
    猜你喜欢
    • 2012-11-10
    • 2020-11-08
    • 2021-07-22
    • 2019-05-27
    • 1970-01-01
    • 2019-08-07
    • 2019-04-10
    • 2014-05-04
    • 2015-11-08
    相关资源
    最近更新 更多