gpt4 book ai didi

java - 在不实例化(未知)具体类型的情况下从方法返回接口(interface)对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:18 24 4
gpt4 key购买 nike

我确信对此有一些解决方案或模式,但我在阐明问题以找到正确答案时遇到了问题。

我有一个接口(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/

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