[英]Java - Generics with lists
我為緩存編寫了一個函數來檢索特定對象。 這樣我就不需要施放它了。
@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的新手,我該怎么寫呢?
java中有一個叫做類型擦除的概念。 由於遺留原因,像List這樣的東西只是一個列表。 它不記得它是運行時的字符串列表。 你應該寫List.class。
然后,您可以在迭代時指定List中的對象類型。
你無法獲得List<String>
,在你的情況下唯一的方法是:
List<String> ipList = (List<String>)Util.inCache(List.class, title);
你可以試試 :
List<String> ipList = Util.inCache(List.class, title);
嘗試這個-
List<String> inList = (List<String>)Test.inCache(List.class, title);
你也可以做 -
List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token);
只是為了澄清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() );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.