gpt4 book ai didi

Java,父静态方法返回子类型

转载 作者:行者123 更新时间:2023-12-01 11:10:30 24 4
gpt4 key购买 nike

我是 java 和泛型的新手,所以请耐心等待。我什至不知道这是否可能。我环顾四周,虽然似乎到处都有一些关于此问题的帖子,但我还没有找到足够清晰地解决我的具体案例的帖子,让我明白该怎么做。

我基本上在父类中有一个静态方法,并希望它根据子类调用它的方式返回各种类型。这里的技巧是,返回的子类也需要在方法内实例化。

这就是我的意思:

public class Parent {

public String value;

public Parent(String value)
{
this.value = value;
}

public static <T extends Parent> T load(DataStorage data, String key)
{
T inst = new ???(data.getValue(key));
return inst;
}
}

public class Child extends Parent {
}

Child child = Child.load(dataStore, "key"); // random dataStore instance

我不知道从这里该去哪里。我用什么来代替 ???这应该是运行 Parent 的子进程(或 load() ) ?我是否还需要做类似 Child.<Child>load() 的事情?

如果您觉得我尝试做这样的事情是错误的,我愿意接受替代设计。我不喜欢在这种情况下必须使用反射的想法(感觉有点老套)

提前致谢,我真的很感激。

最佳答案

我想如果 Java 没有类型删除并且对泛型类型有“带参数约束的构造函数”(如 .net,但它仅对无参数构造函数有约束),那么您想要的就是可能的。

也许这两个适合您的需求:

如果子类型基于某些选择标准(例如枚举),我会使用工厂模式,例如:

public class ParentFactory {
Parent create(SomeEnum t, DataStore dataStore, String key) {
switch (t) {
case SomeEnum.Child1Related:
return new Child1(dataStore.get(key));
...
}
}
}

但是,如果创建完全无关(大多数情况下并非如此),您可以在 Parent 中定义一个 init 方法,并在其中包含初始化程序代码:

abstract class Parent {
String value;
Parent() {}
protected void init(String s) { this.value = s; }
static <T extends Parent> void initialize(DataStore data, String key, T t) {
t.init(data.getValue(key));
}

Child c = new Child();
Parent.init(dataStore, key, c);

如果您想禁止子进程拦截该调用,您可以将 init 方法设置为私有(private)。

老实说,我更喜欢第一个。第二个有点丑:)

关于Java,父静态方法返回子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32443707/

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