我有以下 DataSet 类,我们在其中保存任何类型的对象。主要是将对象从服务器传输到客户端。 contents
变量可以保存任何可序列化的对象。它可以是自定义编写的类对象或 java 类,例如 Integer
, String
等等
我正在尝试将其转换为泛型。我们应该如何同时将其转换为泛型,我想确保我不必更改所有包含对象类的代码,因为我们甚至使用 String
和Integer
内容中的类。
我已经简化了类,仅显示一些相关的字段和方法。
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/