如何根据传入的对象创建对象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 BusTaxiTruck 都是从普通的 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);
        }
    }
}