我需要一个接受任何类型对象的数组或 ArrayList

Posted

技术标签:

【中文标题】我需要一个接受任何类型对象的数组或 ArrayList【英文标题】:I need an array or ArrayList that accepts objects of any type 【发布时间】:2013-12-06 15:21:55 【问题描述】:

我需要在 Java 中创建一个可以接受任意数量的任意类型数组的方法。我需要知道这是否可行,如果可以,怎么办?

【问题讨论】:

任意数量的数组是什么意思? 只需使用ArrayList list = new ArrayList(); 这与ArrayList<Object> list = new ArrayList<>(); 相同,它接受任何类作为输入。 接受数组,并使它们的长度都是最长的。我的想法是采用 Array of Object 数组,但我不确定这是否可行 您可以通过将第一个 List 设为 List 类型来创建二维 ArrayList,如下所示:List<List<Object>> myList = new ArrayList<List<Object>>(); 【参考方案1】:
List<Object> array = new ArrayList<Object>();

每个类都是对象类型,所以应该这样做。

【讨论】:

这个效果最好。回家后我会选择最好的,但现在我必须走了。编辑:感谢您的帮助。【参考方案2】:

您可以像这样创建一个接受任何类型数组的方法:

public <T> void MyMethod(List<T> mylist)
    System.out.println(mylist);

【讨论】:

但这仅适用于泛型类,并且只接受 T 引用的类的列表。 我误解了他的问题,但感谢您指出。【参考方案3】:

要回答您问题的标题,

对象是所有对象的超集。因此,您可以通过创建 Object 类型的数组来实现它。您可以在该数组中插入任何类型。

例如。

ArrayList<Object> list = new ArrayList<Object();

要回答您的问题,即创建一个可以接受任意数量的任意类型数组的方法,请使用变量参数。

例如。

public void method(Object ... params)  <your code>    

// This method will accept any number of parameters of any type.
// If it is specific to ArrayLists, use ArrayList<Object> as the parameter type.

【讨论】:

【参考方案4】:

接受数组,并使它们成为最长的数组的长度

ArrayList of arrays 是一个很好的方法。 Arrays.copyOf 用 null 填充较短的数组

void f(ArrayList<Object[]> list)
        int maxLen = 0;
        for(int i=0;i<list.size();i++)
            maxLen = Math.max(maxLen, list.get(i).length);
        

        for(int i=0;i<list.size();i++)
            if(list.get(i).length < maxLen)
            list.set(i, Arrays.copyOf(list.get(i), maxLen));
        
    

【讨论】:

【参考方案5】:

由于所有数组都是对象,因此您可以使该方法采用 Object 的可变参数。以下是如何按字面意思做你被问到的事情。如果排除基元数组(强制包装器类型,如Integer[]Boolean[]),这可能会有所简化,因此参数为Object[]...。那么你就不需要反射和大长 if/else 块并且可以返回List&lt;Object[]&gt;。在那种情况下,该方法会短得多。否则这种事情很不方便。

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public static List<Object> conform(Object... arrays) 
    ArrayList<Object> out = new ArrayList<Object>(arrays.length);

    int longest = 0;
    for (Object a : arrays) 
        if (!a.getClass().isArray()) 
            throw new IllegalArgumentException(a + " not an array");
        
        int length = Array.getLength(a);
        if (length > longest) longest = length;
    

    for (Object a : arrays) 
        if (a instanceof Object[]) 
            out.add(Arrays.copyOf((Object[])a, longest));

         else if (a instanceof boolean[]) 
            out.add(Arrays.copyOf((boolean[])a, longest));

         else if (a instanceof char[]) 
            out.add(Arrays.copyOf((char[])a, longest));

         else if (a instanceof byte[]) 
            out.add(Arrays.copyOf((byte[])a, longest));

         else if (a instanceof short[]) 
            out.add(Arrays.copyOf((short[])a, longest));

         else if (a instanceof int[]) 
            out.add(Arrays.copyOf((int[])a, longest));

         else if (a instanceof long[]) 
            out.add(Arrays.copyOf((long[])a, longest));

         else if (a instanceof float[]) 
            out.add(Arrays.copyOf((float[])a, longest));

         else if (a instanceof double[]) 
            out.add(Arrays.copyOf((double[])a, longest));
        
    

    return out;

【讨论】:

以上是关于我需要一个接受任何类型对象的数组或 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

数组ArrayListList的区别

Java:具有类似于 ArrayList 的方法/功能的二维数组

定义一个接受 Spark DataFrame 中对象数组的 UDF?

定义一个接受 Spark DataFrame 中对象数组的 UDF?

postgresql中的Rails json列不接受任何值,并在存储后调用时返回nil

类型提示:方法应该接受任何作为对象的 $art