gpt4 book ai didi

java - 集合中的通配符构造函数

转载 作者:行者123 更新时间:2023-12-02 06:55:17 26 4
gpt4 key购买 nike

在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() 时必须插入什么类型?

编辑:池引用它的抽象方法,如下所示:

abstract public class Pool<T> {
(...)
abstract protected T newObject ();
(...)
}

最佳答案

如果您进行一些小的更改,例如创建工厂方法,则可以相当简单地完成。只要你能保证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);
}

关于java - 集合中的通配符构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17457233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com