0

libgdx では、抽象クラスを使用して簡単にプールを作成できますPool。これは抽象クラスであるため、次のように構築するときにメソッドを匿名でオーバーライドする必要があります。

public Pool<String> pool = new Pool<String>() {
@Override
protected String newObject() {
   return new String();
}};

私が今やろうとしているのは、次のような抽象 BaseClass を拡張するジェネリック型 T のワイルドカードを配置することです。

protected static Pool<? extends GameCommand> commandPool = new Pool<? extends GameCommand>() {
    @Override
    protected <T extends GameCommand> newObject() {
        return new T();
    }       
};

しかし、それはうまくいきません。どうすれば入手できますか?

newObject() をオーバーライドする場合、どのような型を挿入する必要がありますか?

編集: プールは、次のような抽象メソッドを参照します:

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 に答える