如何返回一个泛型类?
我试图开发一个ObjectPool,它可以与任何对象一起使用,而无需更改池和对象的源代码 - 但我找不到任何方法来编写get()函数(“Maincode”获取某个对象来自池),因为存在Type-Mismatch(无法从Object转换为TestObject)
这是我的代码到目前为止:
ObjectPool的:
public Object get() {
int first = availableObjects.get(0);
availableObjects.remove(0);
return objects.get(first);
}
在对象(ArrayList)中存在池中的所有对象,availableObjects只包含所有可用对象的列表。 我基本上只是返回第一个可用的对象,并将其标记为不可用。
Maincode:
TestObject test = objectPoolS.get();
我怎样才能使get() - 方法更通用/特定,所以它在每次使用不同的类并且不需要解析maincode的情况下无需调整池就可以工作?
更新:
使用该Pool的更通用版本,get() - 方法将如何正确显示?
(任何其他反馈非常感谢!)
更新:工作(固定)版本的MainCode下面
更新2:
我只是意识到它不能像这样工作,我需要在池中创建新的对象 - 如果没有为每种对象调整池,似乎几乎不可能做到这一点。
那么我能以某种方式删除池中所有对象之间的引用吗? (因为我使用baseObject来初始化所有对象,实际上我只有5个引用到1对象)
还是有更好的方法来管理它? (不强制用户在其代码中创建对象)
完成代码到目前为止:
ObjectPool的
public class ObjectPoolS<T> {
int numberOfObjects;
boolean autoExtending;
T baseObject;
ArrayList<T> objects;
ArrayList<Integer> availableObjects;
public ObjectPoolS(T baseObject, int capacity, boolean allowAutoExtending) {
this.numberOfObjects = capacity;
this.baseObject = baseObject;
this.autoExtending = allowAutoExtending;
objects = new ArrayList<T>(capacity);
availableObjects = new ArrayList<Integer>(capacity);
initialize(baseObject, capacity);
}
private void initialize(T baseObject, int capacity) {
// Initialize List of Objects
for(int i = 0; i < capacity; i++) {
objects.add(baseObject);
}
// Initialize Index of Objects
for(int i = 0; i < capacity; i++) {
availableObjects.add(new Integer(i));
}
}
public T get() {
int first = availableObjects.get(0);
availableObjects.remove(0);
return objects.get(first);
}
}
Maincode(原始)
ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
Maincode(固定)
ObjectPoolS<TestObject> objectPoolS = new ObjectPoolS<TestObject>(new TestObject(0), 5, true);
TestObject test = objectPoolS.get();
TestObject只包含一个用于测试目的的int
错误
Type mismatch: cannot convert from Object to TestObject
你不是合并:你只使用对象的单个实例。
泛型对象池看起来像这样:
public class ObjectPool<T> {
private List<T> objects;
private Class<T> clazz;
private int size;
public ObjectPool(Class<T> clazz, int size) throws IllegalStateException {
this.clazz = clazz;
this.size = size;
this.objects = new ArrayList<T>();
for (int i = 0;i < size;i++) {
objects.add(newInstance());
}
}
// You can override this method with anonymous class
protected T newInstance() {
try {
return clazz.newInstance()
} catch (Exception exception) {
throw new IllegalStateException(exception);
}
}
public synchronized T getInstance() {
if (objects.isEmpty()) {
return null;
}
return objects.remove(objects.size() - 1);
}
public synchronized void returnInstance(T instance) {
if (objects.size() < size) {
objects.add(instance);
}
}
}
不幸的是,我没有编译器来测试代码,但它应该给你一个提示改变什么。
哦,在你的主代码中
ObjectPoolS objectPoolS = new ObjectPoolS(new TestObject(0), 5, true);
you must add "<TestObject>" and becomes
ObjectPoolS<TestObject> objectPoolS
=new ObjectPoolS<TestObject> (new TestObject(0),5,true);
just like where you declare ArrayList, it contains "<T>" and "<Integer>", isn't it?
但是,我相信您的原始代码应该没有问题。 这可能是另一个问题。
提示:在get()方法中,可以重写为:
public T get(){
return this.list.get(this.available.remove(0));
}
你可以试试 :
public <T> T get() {
// Your code for objectToReturn
return (T) objectToReturn;
}
链接地址: http://www.djcxy.com/p/76443.html