我正在尝试将以下方法用于泛型方法并受到攻击。
public static MyObject[] getObjectFromList(List<MyObject> inputList) {
if (inputList != null && inputList.size() > 0) {
return inputList.toArray(new MyObject[inputList.size()]);
} else {
inputList = new ArrayList<MyObject>();
MyObject obj = new MyObject();
inputList.add(obj);
return inputList.toArray(new MyObject[inputList.size()]);
}
}
并使用另一种类似的方法,但它是MyObject2
public static MyObject2[] getObjectFromList(List<MyObject2> inputList) {
if (inputList != null && inputList.size() > 0) {
return inputList.toArray(new MyObject2[inputList.size()]);
} else {
inputList = new ArrayList<MyObject2>();
MyObject2 obj = new MyObject2();
inputList.add(obj);
return inputList.toArray(new MyObject2[inputList.size()]);
}
}
如何将此作为单个方法来获取任何对象(myobject,myobject2)列表和 返回一个数组?
答案 0 :(得分:4)
由于类型擦除,如果不更改方法签名,则无法执行此操作。如果您可以传递标识所需类型的Class
对象,则可以执行以下操作:
public static <T> T[] getObjectFromList(List<? extends T> inputList, Class<T> c) {
if (inputList == null || inputList.isEmpty()) {
inputList = new ArrayList<T>();
T obj = null;
try {
obj = c.newInstance();
} (Exception ex) {
throw new RuntimeException("Instantiation failed", ex);
}
inputList.add(obj);
}
return inputList.toArray(Array.newInstance(c, inputList.size()));
}
答案 1 :(得分:3)
已经有一种方法 - List.toArray()
。
但是,Java中的泛型不允许创建泛型类型的数组(泛型在运行时丢失,因此E[] e = new E[5]
不可能。所以如果你想要一个数组一个特定的类型,而不是Object[]
(上面的方法返回),使用:
MyObject[] array = list.toArray(new MyObject[list.size()]);
“列表中至少有一个对象”是我非常怀疑的要求。这听起来不对。如果你真的确定你想要它,axtavt提供了正确的方法。
答案 2 :(得分:1)
试试这个
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);
Integer[] array = listToArray(list);
for(Integer i : array) {
System.out.println(i);
}
}
@SuppressWarnings("unchecked")
public static <T> T[] listToArray(List<T> list) {
return listToArray(list, (Class<T>) list.get(0).getClass());
}
@SuppressWarnings("unchecked")
public static <T> T[] listToArray(List<T> list, Class<T> clazz) {
return list.toArray((T[]) Array.newInstance(clazz, 0));
}
答案 3 :(得分:0)
为方法提供泛型类型参数:
public <T> T[] getObjectFromList(List<T> c);
或者使用MyObjectInterface类型的对象:
public <T extends MyObjectInterface> T[] getObjectFromList(List<T> c);