在我們搭建框架中往往會用到泛型,我們知道泛型的好處是在編譯的時候檢查類型安全,并且所有的強制轉換都是自動和隱式的,代碼的重用率高?
然而有時候<method>
的入參并不能直接強制轉換成泛型的類型,比如說下面這段代碼:??
很明顯String
?類型不能強制轉換成<T>
?
那我們會需要用到FastJson或者GSON這種類型轉換工具進行類型的轉換工作?
但FastJson和Gson 內方法是這樣的:
public static <T> T parseObject(String text, Class<T> clazz) {return parseObject(text, clazz, new Feature[0]);}
- 1
- 2
- 3
Class<T> clazz
?是顯式的類型。 直接使用的話會報錯:??
不能直接使用<T>
,那么我們需要獲取到<T>
的Class<T> clazz
;?
下面是獲取泛型<T>
的Class<T> clazz
兩種方法:
- 一種是使用反射類reflect
Class<? super T> rawType;rawType = (Class <T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
- 1
- 2
getActualTypeArguments()[0]
中 ‘0’ 代表的是第一個泛型類型。
- 第二種采用Gson來獲取
Class<? super T> rawType;public BaseCallback() {this.mType = getSuperclassTypeParameter(getClass());this.rawType = (Class<? super T>) $Gson$Types.getRawType(mType);}static Type getSuperclassTypeParameter(Class<?> subclass) {Type superclass = subclass.getGenericSuperclass();if (superclass instanceof Class) {throw new RuntimeException("Missing type parameter.");}ParameterizedType parameterized = (ParameterizedType) superclass;return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
Class<? super T> rawType
就是我們泛型<T>
的數據類型Class<T> clazz
?