簡體   English   中英

Gson TypeToken如何運作?

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

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