gpt4 book ai didi

Java - 对多种类型使用泛型

转载 作者:行者123 更新时间:2023-11-30 03:47:19 24 4
gpt4 key购买 nike

我有以下 DataSet 类,我们在其中保存任何类型的对象。主要是将对象从服务器传输到客户端。 contents变量可以保存任何可序列化的对象。它可以是自定义编写的类对象或 java 类,例如 Integer , String等等

我正在尝试将其转换为泛型。我们应该如何同时将其转换为泛型,我想确保我不必更改所有包含对象类的代码,因为我们甚至使用 StringInteger内容中的类。

我已经简化了类,仅显示一些相关的字段和方法。

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import java.util.Hashtable;
import java.util.Vector;

public class DataSet implements Serializable, PropertyChangeListener{

Hashtable contents = new Hashtable();

@Override
public void propertyChange(PropertyChangeEvent arg0) {
// TODO Auto-generated method stub

}

public void addObject(Object obj){
Vector vector = (Vector)contents.get(obj.getClass());
if (vector == null){
vector = new Vector();
vector.add(obj);
contents.put(obj.getClass(), vector);
}
}

public Vector getObjects(Class objType){
if (contents.contains(objType)){
return (Vector)contents.get(objType);
}
else{
return new Vector();
}
}
}

感谢您的及时回复。但是,在查看了以下三个答案后,我觉得我没有正确地表达问题。

为了按照我想要的方式实现,如果我调用 dataset.getObjects(E 类型),我应该获得 E 类型的 vector 。我不应该转换到( vector )。因为我希望内容保持 Class<E> ,和Vector<E>键值对。如果我们能做到这一点,那么只有我可以说这是 safe .

DataSet ds = new DataSet();
Vector<String> strings = ds.getObjects(String.class);
Vector<Integer> integer = ds.getObjects(Integer.class);
Vector<Employee> employees = ds.getObjects(Employee.class);

最佳答案

首先,远离Vector类,它已经过时了;使用ArrayList代替。

这是一种存储异构对象的简单方法,同时避免在检索对象时进行显式转换。我确信您可以将此模型应用到您的解决方案中。

已更新,感谢 Paul Bellora 的建议。

public class DataSet { 

private Map<Class<?>, List<?>> contents;

public DataSet(){
contents = new HashMap<Class<?>, List<?>>();
}

@SuppressWarnings(value = { "unchecked" })
public <T> void addObject(Class<T> klass, T object){
List<T> objectsList = (List<T>)contents.get(klass);
if (objectsList == null){
objectsList = new ArrayList<T>();
contents.put(klass, objectsList);
}
objectsList.add(object);
}

@SuppressWarnings(value = { "unchecked" })
public <T> List<T> getObjects(Class<T> klazz) {
return contents.containsKey(klazz) ?
contents.get(klazz) : Collections.EMPTY_LIST;
}

public static <S, T extends Iterable<S>> void print(T list){
for (Object element : list){
System.out.println(element);
}
}

public static void main(String[] o){
DataSet ds = new DataSet();
ds.addObject(String.class, "save the earth!");
ds.addObject(String.class, "firing now!");
ds.addObject(Integer.class, new Integer(100));
ds.addObject(Boolean.class, new Boolean(true));

print(ds.getObjects(String.class));
print(ds.getObjects(Boolean.class));
print(ds.getObjects(Integer.class));
}
}

希望有帮助。

关于Java - 对多种类型使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25327038/

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