在我的程序中,我具有以下类层次结构:
public abstract class Effect
{
// ...
}
public class Effect1 extends Effect
{
public static final NAME = "blah blah 1";
// ...
}
public class Effect2 extends Effect
{
public static final NAME = "blah blah 2";
// ...
}
(许多具有不同实现的EffectN类)。后来,我有了另一个使用这些EffectN的类:
public abstract class EffectList
{
protected Effect mEffect;
// ...
}
public class EffectList1 extends EffectList
{
public static final N = Effect1.NAME;
public EffectList1
{
mEffect = new Effect1();
}
// ...
}
public class EffectList2 extends EffectList
{
public static final N = Effect2.NAME;
public EffectList2
{
mEffect = new Effect2();
}
// ...
}
(这些EffectListN类更多,每个EffectN一个)。
现在,虽然EffectN确实具有完全不同的实现,但所有EffectListN都(几乎)相同-上面显示了它们之间的唯一区别。
现在,如果使用的是C ++,则只需一个模板就可以轻松生成所有EffectListN类,但是AFAIK(对Java来说是很新的东西)Java泛型无法完成这项工作,可以吗?
有什么建议么?
最佳答案
您是否在尝试创建通用方法来调用构造函数?如果是这样的话,只要所有实现都提供相同种类的参数即可,例如可以通过反思来完成。默认构造函数:
class EffectList<EffectType extends Effect> {
public EffectList(Class<EffectType> clazz) {
try {
mEffect = clazz.getConstructor().newInstance();
} catch (Exception ex) {
// suppressing Exceptions - in production code you should handle it better
throw new RuntimeException(ex);
}
// ...
}
// ...
}
然后像这样使用它:
EffectList<Effect1> effectList1 = new EffectList(Effect1.class);
EffectList<Effect2> effectList2 = new EffectList(Effect2.class);
但是,无法以这种方式处理静态字段-最好的办法是将其设置为实例变量,并通过反射来获取值:
clazz.getDeclaredField("NAME").get(null); // null is used to obtain static fields
无法处理静态字段的原因是,在所有EffectList中只能共享一个变量(因为在其仅一个类的下面,仅添加了编译时检查)。