【发布时间】:2015-09-07 17:39:09
【问题描述】:
我是 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
我不知道从这里去哪里。我应该用什么来代替 ??? 哪个应该是运行 load() 的孩子(或 Parent)?我是否还需要按照Child.<Child>load() 的方式做一些事情?
如果您觉得我尝试做这样的事情有误,我愿意接受替代设计。我不喜欢在这种情况下不得不玩反射的想法(感觉有点老套)
在此先感谢,我真的很感激。
【问题讨论】:
-
只有一种方法可以替换您的
???:您需要传递对象的类并使用反射。看到这个问题:stackoverflow.com/questions/1090458/… -
谢谢,我看到了,因为我有构造函数参数,它最终变得有点混乱。我觉得不需要使用反射,是否有替代设计?
-
1. T 有一个上限(父级)但没有下限,所以你不能用任何东西代替 ???不引发编译器警告。除了,正如@Tunaki 所说,传递一个 Class
参数。 -
(抱歉,我不知道 Enter 键 == 提交...刚刚赢得了一些评论的声誉:D)。 2. Child.load(...)等价于Parent.load(...),没办法给它不同的类型参数。
-
谢谢我忽略了我在示例中运行负载而没有参数的事实。所以本质上,它要么是反射,要么什么都没有? @Tunaki 引用的帖子提到了工厂接口。可能会看看这对我是否会更好