我确信对此有一些解决方案或模式,但我在阐明问题以找到正确答案时遇到了问题。
我有一个接口(interface),ICar:
public interface ICar {
void SetMake(String make);
String GetMake();
}
我有课,车:
public class Car implements ICar {
private String make;
public void SetMake(String make) { this.make = make; }
public String GetMake() { return make; }
我在另一个类中有一个方法,它不知道 Car。本着多态性的精神,我希望此方法返回一个 ICar,以便有人可以创建自己的 ICar 实现并将该方法用于他们的汽车:
...//class preamble
public ICar myMethod() {
ICar myCar = new ICar();
myCar.SetMake("Ferrari");
return myCar;
}
我不确定为什么这样的东西行不通。由于 ICar 包含方法 SetMake,因此每个实现也必须包含此方法。 jvm 肯定可以通过某种方式将方法调用排队,然后在方法的具体化可用时运行它们吗?
另一个想法是将新创建的 ICar 实现作为参数传递给 myMethod 并调用它的方法,但我觉得这可能不是一个干净的实现,因为我每次都需要创建一个 Car 实例.此外,如果没有无参数构造函数,我将不得不使用虚拟数据(也不是干净的)对其进行实例化。
我觉得我对如何实现这样的东西缺乏了解,想知道是否有人可以提供帮助?
谢谢。
最佳答案
一种方法是提供类类型作为参数,并使其通用:
public <T extends ICar> T myMethod(Class<T> type) {
try {
T myCar = type.newInstance(); // T needs a visible no-args constructor
myCar.SetMake("Ferrari");
return myCar;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
(另请注意,我通过将任何异常包装在 RuntimeException
中来处理异常)
然后你需要这样调用它:
Car car = myMethod(Car.class);
一种更灵活的方法是引入工厂接口(interface)并将工厂实例传递给myMethod
,后者使用它来创建具体的ICar
。工厂仍然可以是通用的:
public interface ICarFactory<T extends ICar> {
T createCar();
}
...
public <T extends ICar> T myMethod(ICarFactory<T> factory) {
T myCar = factory.createCar();
myCar.SetMake("Ferrari");
return myCar;
}
...
Car car = myMethod(carFactory);
关于java - 在不实例化(未知)具体类型的情况下从方法返回接口(interface)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316969/