2015-09-14 32 views
0

是否有可能得到與Class<List<Data>>.class類似的內容?我讀過你不能撥打.class,因爲它是如何工作的,所以我想知道是否可能使用類似於new ArrayList<Data>().getClass()的東西可以工作?那一個特別不起作用,因爲返回的班級是Class<? extends List<Data>>,所以我沒有選擇,它甚至有可能嗎?獲取類<T>文字或類型

語境:我試圖使用square/moshi解析一個List<Data>但庫似乎是阿爾法所以它的文檔。

+1

泛型用[類型擦除](http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。 這基本上意味着,當編譯代碼時,所有的泛型信息都消失了,並且在運行時不再可用。 因此,就運行時訪問(例如反射)而言,列表和List之間沒有實際差異。 –

+0

似乎有一種方法接受'Type'作爲參數來創建一個適配器。你可能想要提供它,就像你可以用Gson的'TypeToken'技巧得到一個類型一樣。另見http://stackoverflow.com/questions/30005110/how-does-gson-typetoken-work –

回答

2

沒有Class對象代表List<Data>,因爲泛型類型只是編譯時功能。有可能通過這樣

Class<List<Data>> clazz = (Class<List<Data>>) (Object) List.class; 

,使靜態類型Class<List<Data>>的變量你得到一個編譯器警告這裏。真的clazz只是List.class和編譯器警告是暗示,你在做什麼不是一個好主意。

沒有Class對象代表List<Data>,但有一個Type對象。

嘗試這種情況:

public class Main { 

    List<String> list; 

    public static void main(String[] args) throws Exception { 
     // prints java.util.List<java.lang.String> 
     System.out.println(Main.class.getField("list").getGenericType()); 
    } 
} 
+0

如果不是'List '它是'List '?我必須將'Type'對象傳遞給json解析器庫,並且所述類型應爲'List ',以便庫知道它應該替換'Data'的'T'。它可以工作嗎? –

+0

我剛試過,它說'java.util.List '。說實話,我越來越接近我在這個問題上的知識程度。我同意亞歷克西斯C,你應該看看'TypeToken'。 –