关于通用方法的问题

时间:2011-03-03 08:50:51

标签: java generics

我正在尝试将以下方法用于泛型方法并受到攻击。

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)列表和 返回一个数组?

4 个答案:

答案 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);