[英]How does Gson TypeToken work?
據我所知,在Java中,例如,C#泛型是編譯時功能,並通過類型擦除刪除。 那么,Gson的TypeToken
如何真正起作用? 它是如何獲得對象的泛型類型的?
從JLS的§4.6 (強調我的):
類型擦除是從類型(可能包括參數化類型和類型變量)到類型(從不參數化類型或類型變量)的映射。 我們寫| T | 用於擦除類型T.擦除映射定義如下:
參數化類型(第4.5節)G的擦除是| G |。
嵌套類型TC的擦除是| T | .C。
數組類型T []的擦除是| T | []。
類型變量(第4.4節)的擦除是其最左邊界的擦除。
每種其他類型的擦除都是類型本身。
因此,如果您聲明一個具有自己的匿名子類的類,它將保持其參數化類型; 它沒有被刪除。 因此,請考慮以下代碼:
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.HashMap;
public class Erasure<T>
{
public static void main(String...strings) {
Class<?> foo = new Erasure<HashMap<Integer, String>>() {}.getClass();
ParameterizedType t = (ParameterizedType) foo.getGenericSuperclass();
System.out.println(t.getOwnerType());
System.out.println(t.getRawType());
System.out.println(Arrays.toString(t.getActualTypeArguments()));
}
}
這輸出:
null
class Erasure
[java.util.HashMap<java.lang.Integer, java.lang.String>]
請注意,如果由於擦除而未匿名聲明該類,則會出現ClassCastException
; 超類不是參數化類型,它將是一個Object
。
Java的類型擦除適用於單個對象,而不是類或字段或方法。 TypeToken使用匿名類來確保它保留泛型類型信息,而不是僅創建對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.