将类类型作为参数传递给ArrayList使用?

时间:2017-02-06 14:07:27

标签: java class arraylist reflection

我需要编写一个java方法,它接受一个类(不是一个对象),然后用该类创建一个ArrayList作为数组中每个成员的元素。伪代码示例:

public void insertData(String className, String fileName) {
      ArrayList<className> newList = new ArrayList<className>();
}

如何在Java中实现这一目标?

4 个答案:

答案 0 :(得分:4)

您可以使用Generic methods

public <T> void insertData(Class<T> clazz, String fileName) {
   List<T> newList = new ArrayList<>();
}

但是如果你应该使用这个合约insertData(String className, String fileName),你就不能使用泛型,因为Java的编译时无法解析列表项的类型。

在这种情况下,您可以根本不使用泛型,并在将其放入列表之前使用反射来检查类型:

public void insertData(String className, String fileName) {
    List newList = new ArrayList();

    Class clazz;
    try {
        clazz = Class.forName(className);
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e); // provide proper handling of ClassNotFoundException 
    }

    Object a1 = getSomeObjectFromSomewhere();

    if (clazz.isInstance(a1)) {
        newList.add(a1);
    }
    // some additional code
}

但是如果没有课程信息,您只能使用Object,因为您无法在代码中将对象转换为UnknownClass。

答案 1 :(得分:2)

Vlad Bochenin给出了一个很好的方法,但是提供一个从你的方法中没有任何东西的T泛型是没有意义的。
它在操作列表的insertData()代码中设置了零约束。
您将被迫在代码中进行强制转换,这违背了泛型的目的。

我想你想在insertData()中操纵一些已知类的实例 如果你在你的情况下使用泛型,如果你有类的子类型可以操作它会更有意义。

通过这种方式,您可以拥有一个接受基类型及其子类的方法。

public static <T extends YourClass> void insertData(Class<T> clazz, String fileName) {
    List<T> newList = new ArrayList<>();
    T t = newList.get(0);
    // here I can manipulate something that derives from YourClass
}

答案 2 :(得分:2)

我的猜测是你真正想做的是返回生成的List。这可能是这样的:

public <T> List<T> loadData(Class<T> clazz, String fileName) {
    List<T> newList = new ArrayList<>();

    //...populate list somehow (e.g. with values deserialized from the file named "filename")

    return newList;
}

这是如何使用的:

List<String> names = loadData(String.class, "someFileContainingNameStrings");
List<Double> temperatures = loadData(Double.class, "someFileContainingTemperatureData");

答案 3 :(得分:0)

这不是一个好习惯,只是使用Object和

的示例
this.array_employee = loadDataArrayListFromFileJson(fileName_employee, Employee.class);
this.array_movie = loadDataArrayListFromFileJson(fileName_movie, Movie.class);
this.array_store = loadDataArrayListFromFileJson(fileName_store, Store.class);
private <T> ArrayList<T> loadDataArrayListFromFileJson(String filename, Class class__) {
    ArrayList<T> arraylist_objects = new ArrayList<>();

    String jsonArrayString = getResourceAsString(filename);
    JsonParser parser = new JsonParser();
    Gson gson = new Gson();

    JSONArray json_array = new JSONArray(jsonArrayString);
    for (Object object : json_array) {
        JsonElement json_element = parser.parse(object.toString());
        Object element = gson.fromJson(json_element, class__);
        System.out.println(element);
        arraylist_objects.add((T) element);
    }
    return arraylist_objects;
}