簡體   English   中英

Java - 帶列表的泛型

[英]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>.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() );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM