[英]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.