在libgdx中,您可以使用抽象类Pool
轻松创建池。
因为它是一个抽象类,所以在构造它时需要匿名覆盖它的方法:
public Pool<String> pool = new Pool<String>() {
@Override
protected String newObject() {
return new String();
}};
我现在要做的是为通用类型T添加一个通配符,它扩展了一个抽象的BaseClass,如下所示:
protected static Pool<? extends GameCommand> commandPool = new Pool<? extends GameCommand>() {
@Override
protected <T extends GameCommand> newObject() {
return new T();
}
};
但它不起作用。我怎么能得到它?
覆盖newObject()时我必须插入哪种类型?
编辑: Pool引用它的抽象方法如下:
abstract public class Pool<T> {
(...)
abstract protected T newObject ();
(...)
}
答案 0 :(得分:2)
如果你做一个像工厂方法那样的小改动,可以相当简单地完成。只要你能确保GameCommand的所有子类都有一个默认的构造函数。 (虽然,你可以用Objenesis解决这个问题。)
请执行以下操作:
public static <T extends GameCommand> Pool<T> createCommandPool(final Class<T> clazz) {
return new Pool<T>() {
@Override protected T newObject() {
try {
return clazz.newInstance();
} catch (Exception e) {
throw new RuntimeException(e); // cause there isn't really much else you can do.
}
}
};
}
public static void main(String[] args) {
Pool<? extends GameCommand> gcPool = createCommandPool(GameCommand.class);
// MyCommand extends GameCommand
Pool<? extends GameCommand> mcPool = createCommandPool(MyCommand.class);
}