2

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

@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很陌生,我该怎么写?

4

5 回答 5

6

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

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

于 2012-08-17T16:13:20.503 回答
4

您无法获得 class of List<String>,就您而言,唯一的方法是:

List<String> ipList = (List<String>)Util.inCache(List.class, title);
于 2012-08-17T16:14:24.933 回答
1

你可以试试 :

List<String> ipList = Util.inCache(List.class, title);
于 2012-08-17T16:24:24.807 回答
1

试试这个-

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

你也可以这样做 -

List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token);
于 2012-08-17T16:31:53.443 回答
1

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

意思,List<String>.class完全一样,List<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() );
于 2012-08-17T19:03:01.813 回答