2013-07-03 19 views
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(); 
(...) 
} 
+0

你的第一個代碼本身將無法編譯。你嘗試過嗎? –

+0

它不會因爲你不能從給出泛型類型T獲得構造函數。我會使用類似反射的東西來訪問構造函數。 –

+0

您可能需要查看[Abstract Factory](http://en.wikipedia.org/wiki/Abstract_factory_pattern)和[工廠方法](http://en.wikipedia.org/wiki/Factory_method_pattern)設計模式到開始尋找替代解決方案。 –

回答

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); 
} 
相關問題