在我的程序中,我具有以下类层次结构:

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中只能共享一个变量(因为在其仅一个类的下面,仅添加了编译时检查)。

08-05 00:56