我需要一个接受任何类型对象的数组或 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
【参考方案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<Object[]>
。在那种情况下,该方法会短得多。否则这种事情很不方便。
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的主要内容,如果未能解决你的问题,请参考以下文章
Java:具有类似于 ArrayList 的方法/功能的二维数组
定义一个接受 Spark DataFrame 中对象数组的 UDF?
定义一个接受 Spark DataFrame 中对象数组的 UDF?