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

标签 java generics

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

相关文章:

java - Spring Security BCrypt 总是寻找 “$2a” 正则表达式

C# 反射匹配类型 List<T> where T IsSubClass(Foo)

java - 泛型集合 "Cannot instantiate the type ArrayList<? extends OpDTO> "

java - 具有通用返回类型的命令模式

java - 如何使用 “gradle build”命令创建fatJar

java - 如何在 Cucumber for Java 中执行标记驱动的跨浏览器测试?

java - 带有必须实现 Serialized 的参数的静态方法

java - "incompatible types"lambda/方法引用和泛型编译器错误

java - java中如何捕获main方法抛出的异常?

java - SASL_SSL 安全协议(protocol)如何工作?客户端是否验证服务器(X.509 证书)?