1. 程式人生 > >Java筆記——泛型擦除

Java筆記——泛型擦除

port lac 說明 print java筆記 obj auto The com

1. 泛型擦除

package cn.Douzi.T_Demo;

import java.util.ArrayList;

/**
 * @Auther: Douzi
 * @Date: 2019/3/8
 * @Description: cn.Douzi.T_Demo
 * @version: 1.0
 */
public class ToolTest {

    public static void main(String[] args) {

        ArrayList<String> a1=new ArrayList<String>();
        a1.add(
"abc"); ArrayList<Integer> a2=new ArrayList<Integer>(); a2.add(123); System.out.println(a1.getClass() == a2.getClass()); } }

技術分享圖片

說明泛型類型String和Integer都被擦除掉了,只剩下了原始類型。

泛型本身有一些限制。比如:

技術分享圖片

那麽,利用反射,我們繞過編譯器去調用 add 方法。

package cn.Douzi.T_Demo;

import
java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class T_demo01 { public static void main(String[] args) { // TODO Auto-generated method stub List<Integer> a1 = new ArrayList<Integer>(); a1.add(
123); try { Method method = a1.getClass().getDeclaredMethod("add", Object.class); method.invoke(a1, "test"); method.invoke(a1, 43.9f); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (Object e : a1) { System.out.println(e); } } }

技術分享圖片

Java筆記——泛型擦除