簡體   English   中英

傳遞類類型作為參數以在 ArrayList 中使用?

[英]Pass class type as parameter to use in ArrayList?

我需要編寫一個 java 方法,它接受一個類(不是一個對象),然后創建一個 ArrayList ,該類作為數組中每個成員的元素。 偽代碼示例:

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

我如何在 Java 中完成此操作?

您可以使用泛型方法

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。

我的猜測是您真正想要做的是返回生成的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");

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
}

這不是一個好習慣,只是一個使用 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM