如何根据传入的对象创建对象java
How to create an object according to the objects passed in java
当传入的参数是泛型时,如何创建特定类型的对象?这是我所拥有的:
public class Sample{
static ArrayList<Bus> buses;
static ArrayList<Taxi> taxis;
static ArrayList<Truck> trucks;
public static void main(String[] args) {
readInFile("busStates.txt",buses);
readInFile("taxiStates.txt",taxis);
readInFile("truckStates.txt",trucks);
}
public static <T> void readInFile(String fileName, ArrayList <T> targetList){
Scanner inFile = new Scanner(new FileInputStream(fileName));
while(inFile.hasNextLine()){
T t = new T(inFile.nextLine().split("\t")); //this failed.
//I hope it can do Bus t = new Bus(params) when busList is passed in
targetList.add(t);
}
}
当我传入包含 Bus 对象的 busList<> 时,我认为 java 将能够创建 Bus 对象。
有什么方法可以根据传入的参数类型来初始化对象吗?我希望我的程序在传入 busList 时调用 Bus 构造函数,并对 taxiList、truckList 执行相同的操作。
旁注:公共汽车、出租车和卡车扩展了一个公共超类。
谢谢。
我假设你的 classes Bus
、Taxi
和 Truck
都是从普通的 superclass Vehicle
.
您可以通过添加一个 Class<T>
类型的参数来解决您的问题
到您的 readInFile
方法,指示要创建的车辆 class。
public static void main(String[] args) throws IOException {
readInFile("busStates.txt", buses, Bus.class);
readInFile("taxiStates.txt", taxis, Taxi.class);
readInFile("truckStates.txt", trucks, Truck.class);
}
在阅读方法中你使用了Class<T>
参数
获取接受 String[]
参数的 class 的 Constructor<T>
,
然后调用此构造函数来创建实际的 T
对象。
public static <T extends Vehicle> void readInFile(String fileName, ArrayList<T> targetList, Class<T> clazz) throws IOException {
Scanner inFile = new Scanner(new FileInputStream(fileName));
while (inFile.hasNextLine()){
String[] params = inFile.nextLine().split("\t");
try {
Constructor<T> constructor = clazz.getConstructor(String[].class);
T t = constructor.newInstance((Object[]) params);
targetList.add(t);
} catch (NoSuchMethodException | SecurityException | InstantiationException |
IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new RuntimeException("Problem with constructor", e);
}
}
}
当传入的参数是泛型时,如何创建特定类型的对象?这是我所拥有的:
public class Sample{
static ArrayList<Bus> buses;
static ArrayList<Taxi> taxis;
static ArrayList<Truck> trucks;
public static void main(String[] args) {
readInFile("busStates.txt",buses);
readInFile("taxiStates.txt",taxis);
readInFile("truckStates.txt",trucks);
}
public static <T> void readInFile(String fileName, ArrayList <T> targetList){
Scanner inFile = new Scanner(new FileInputStream(fileName));
while(inFile.hasNextLine()){
T t = new T(inFile.nextLine().split("\t")); //this failed.
//I hope it can do Bus t = new Bus(params) when busList is passed in
targetList.add(t);
}
}
当我传入包含 Bus 对象的 busList<> 时,我认为 java 将能够创建 Bus 对象。
有什么方法可以根据传入的参数类型来初始化对象吗?我希望我的程序在传入 busList 时调用 Bus 构造函数,并对 taxiList、truckList 执行相同的操作。
旁注:公共汽车、出租车和卡车扩展了一个公共超类。
谢谢。
我假设你的 classes Bus
、Taxi
和 Truck
都是从普通的 superclass Vehicle
.
您可以通过添加一个 Class<T>
类型的参数来解决您的问题
到您的 readInFile
方法,指示要创建的车辆 class。
public static void main(String[] args) throws IOException {
readInFile("busStates.txt", buses, Bus.class);
readInFile("taxiStates.txt", taxis, Taxi.class);
readInFile("truckStates.txt", trucks, Truck.class);
}
在阅读方法中你使用了Class<T>
参数
获取接受 String[]
参数的 class 的 Constructor<T>
,
然后调用此构造函数来创建实际的 T
对象。
public static <T extends Vehicle> void readInFile(String fileName, ArrayList<T> targetList, Class<T> clazz) throws IOException {
Scanner inFile = new Scanner(new FileInputStream(fileName));
while (inFile.hasNextLine()){
String[] params = inFile.nextLine().split("\t");
try {
Constructor<T> constructor = clazz.getConstructor(String[].class);
T t = constructor.newInstance((Object[]) params);
targetList.add(t);
} catch (NoSuchMethodException | SecurityException | InstantiationException |
IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new RuntimeException("Problem with constructor", e);
}
}
}