Java 集合中的通配符构造函数
在libgdx中,您可以使用抽象类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
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来获取构造函数。我将使用类似于反射的方法来访问构造函数。您可能希望查看和设计模式,以开始搜索替代解决方案。