Java 集合中的通配符构造函数

Java 集合中的通配符构造函数,java,generics,libgdx,wildcard,Java,Generics,Libgdx,Wildcard,在libgdx中,您可以使用抽象类pool轻松创建池。 因为它是一个抽象类,所以在按如下方式构造它时,需要匿名重写它的方法: public Pool<String> pool = new Pool<String>() { @Override protected String newObject() { return new String(); }}; protected static Pool<? extends GameCommand> comman

在libgdx中,您可以使用抽象类
pool
轻松创建池。 因为它是一个抽象类,所以在按如下方式构造它时,需要匿名重写它的方法:

public Pool<String> pool = new Pool<String>() {
@Override
protected String newObject() {
   return new String();
}};
protected static Pool<? extends GameCommand> commandPool = new Pool<? extends GameCommand>() {
    @Override
    protected <T extends GameCommand> newObject() {
        return new T();
    }       
};
abstract public class Pool<T> {
(...)   
abstract protected T newObject (); 
(...)
}
public Pool=new Pool(){
@凌驾
受保护的字符串newObject(){
返回新字符串();
}};
我现在要做的是为泛型类型T添加一个通配符,它扩展了一个抽象基类,如下所示:

public Pool<String> pool = new Pool<String>() {
@Override
protected String newObject() {
   return new String();
}};
protected static Pool<? extends GameCommand> commandPool = new Pool<? extends GameCommand>() {
    @Override
    protected <T extends GameCommand> newObject() {
        return new T();
    }       
};
abstract public class Pool<T> {
(...)   
abstract protected T newObject (); 
(...)
}

protectedstaticpool如果您做一些小的更改,比如制作一个工厂方法,那么它可以非常简单地完成。只要您能确保GameCommand的所有子类都有一个默认构造函数。(不过,你可以用objeness解决这个问题)

只需执行以下操作:

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);
}
公共静态池createCommandPool(最终类clazz){
返回新池(){
@重写受保护的T newObject(){
试一试{
返回clazz.newInstance();
}捕获(例外e){
抛出新的RuntimeException(e);//因为实际上您不能做很多其他事情。
}
}
};
}
公共静态void main(字符串[]args){

池您的第一个代码本身将无法编译。您尝试过吗?不会,因为您无法通过仅提供泛型类型t来获取构造函数。我将使用类似于反射的方法来访问构造函数。您可能希望查看和设计模式,以开始搜索替代解决方案。