gpt4 book ai didi

java - Java中将可变参数扩展为相应的数量和类型

转载 作者:行者123 更新时间:2023-12-01 17:00:34 26 4
gpt4 key购买 nike

考虑两辆车,一辆汽车和一辆火车。 Car 的构造函数接收两个参数,Train 的构造函数接收一个参数。论点的类型和数量不同。我想要一个通用方法,可以使用 Java 中的可变参数调用两个构造函数。假设我无法更改车辆、汽车和火车。

问题是如何在doSomething方法中扩展args。将变量 args 扔到 M 类型的新实例中是行不通的。这可行吗?

public class MainTest {

// Receive concrete type of vehicle and arguments for its constructor (variable)
public <M extends Vehicle> M doSomething(Class<M> a, Object... args)
throws InstantiationException, IllegalAccessException {

// How to pass variable number of arguments for the constructors?
M m = a.newInstance( args ); // <-- Problem is here, possible to solve?

return m;
}

public static void main(String[] args) throws InstantiationException, IllegalAccessException {
MainTest test = new MainTest();
Car c = test.doSomething(Car.class, "Jill", 35);
Train t = test.doSomething(Train.class, 35.1);
}
}

public class Vehicle {
/* currently empty */
}

public class Car extends Vehicle {
public Car(String name, int n) {
}
}

public class Train extends Vehicle {
public Train(double d) {
}
}

最佳答案

问题是 the newInstance method不接受任何参数。它调用无参构造函数(如果存在)。

当您只有类时,要将参数传递给构造函数,您将需要使用反射来查找适当的构造函数。在 Class 对象上,调用 the getConstructors() method并循环返回的 Constructor 对象数组以找到合适的对象,或调用 the getConstructor method ,传递代表参数类型的Class对象来获取特定的构造函数。由于您列出的每个类只有一个构造函数,因此只需获取 getConstructors() 返回的数组的第一个元素即可。

当您拥有适当的构造函数时,调用它的newInstance method ,它在其参数中接受构造函数参数。

关于java - Java中将可变参数扩展为相应的数量和类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com