我为缓存编写了一个函数来检索特定对象。这样我就不需要施放它了。
@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的新手,我该怎么写呢?
答案 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>.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() );