Java - 带列表的泛型

时间:2012-08-17 16:07:44

标签: java generics

我为缓存编写了一个函数来检索特定对象。这样我就不需要施放它了。

@SuppressWarnings("unchecked")
    public static <T> T inCache(Class<T> obj, String token) {

        Object cacheObj = Cache.get(token);
        if (cacheObj != null) {

            if (obj.isAssignableFrom(cacheObj.getClass())) {
                return (T) cacheObj;
            }
        }
        return null;

    }

我正在使用它

String s = inCache(String.class, title);

但是现在我的缓存中有一个字符串列表,我不能像这样使用它

List<String> ipList = Util.inCache(List<String>.class, title);

问题是List<String>.class。我是java的新手,我该怎么写呢?

5 个答案:

答案 0 :(得分:6)

java中有一个名为type erasure的概念。由于遗留原因,像List这样的东西只是一个列表。它不记得它是运行时的字符串列表。你应该写List.class。

然后,您可以在迭代时指定列表中的对象类型。

答案 1 :(得分:4)

你无法获得List<String>课程,在你的情况下唯一的方法是:

List<String> ipList = (List<String>)Util.inCache(List.class, title);

答案 2 :(得分:1)

您可以尝试:

List<String> ipList = Util.inCache(List.class, title);

答案 3 :(得分:1)

试试这个 -

List<String> inList = (List<String>)Test.inCache(List.class, title);

你也可以 -

List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token);

答案 4 :(得分:1)

只是为了澄清Joe的答案(我没有足够的声誉来评论),在运行时,List <String>List<Integer>或任何其他类型的List之间没有区别,泛型不会在运行时保留。

含义,List<String>.classList<Integer>.class完全相同,实际上是List.class。这是Java类型系统的一个弱点。我不熟悉一种实现你想要的简单方法。

代码证明:

// It is true that      
    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>();                                               
    System.out.println( stringList.getClass() == integerList.getClass()  );

    // And that ... 
    List objectList = new ArrayList();
    System.out.println( stringList.getClass() == objectList.getClass()  );

    //However, the following is false because a different implementation is used ( I wanted a false case)
    List objectLinkedList = new LinkedList();
    System.out.println(  objectLinkedList.getClass() == objectList.getClass() );