0

在 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 (); 
(...)
}
4

1 回答 1

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);
}
于 2013-07-03T20:49:08.210 回答