我需要编写一个java方法,它接受一个类(不是一个对象),然后用该类创建一个ArrayList作为数组中每个成员的元素。伪代码示例:
public void insertData(String className, String fileName) {
ArrayList<className> newList = new ArrayList<className>();
}
如何在Java中实现这一目标?
答案 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;
}