Java - 对多种类型使用泛型

标签 java generics

我有以下 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/

相关文章:

java - 如何向服务器提交请求而不需要响应

java - Wildfly 8,远程调试应用

Java:帮助我理解:如何在有界通配符字段上使用接口(interface)方法?

Java 多 -"where"关键字?

java - NCAA 2011/12 男子篮球队和球员统计数据的 API

java - 递归回文函数不断返回默认结果值?

java - 下面的代码是复合的,如果不是那么如何使其复合?

java - 返回泛型类型的新实例,其中 T 设置为给定 arg 的类型

kotlin - 泛型参数化变量/常量的语法

scala - 为什么 A => String 与 _1.type => String where val _1 : A? 不同