我是 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/