关于对泛型擦除机制的几个测试

测试原因

在对泛型擦除机制的学习中,有一些困惑,因此做了几个实验来验证自己所学习的内容是否正确。

测试1

public class ErasedTypeEquivalence {
    private void setList(List list){
        list.add("1234");
        list.add(123);
    }
    public static void main(String[] args){
        //两个类型相同
        Class c1=new ArrayList<String>().getClass();
        Class c2=new ArrayList<Integer>().getClass();
        System.out.println(c1 == c2);

        List<String> list1=new ArrayList<>();
        List<Integer> list2=new ArrayList<>();
        list1.add("23");
        //以下代码编译不通过
//        list1.add(123);
        list2.add(123);
//        list2.add("123");
        ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
        erasedTypeEquivalence.setList(list1);
        erasedTypeEquivalence.setList(list2);
        System.out.println("list1:");
        for (Object o:list1){
            System.out.println(o.getClass().getName());
        }
        System.out.println("list2:");
        for (Object o:list2){
            System.out.println(o.getClass().getName());
        }
        System.out.println(list1+"--"+list2);
    }
}


输出结果

true
list1:
java.lang.String
java.lang.String
java.lang.Integer
list2:
java.lang.Integer
java.lang.String
java.lang.Integer
[23, 1234, 123]--[123, 1234, 123]

测试2

再次试验,假如取出的时候的类型不是Object

package generics;

import java.util.ArrayList;
import java.util.List;

public class ErasedTypeEquivalence {
    private void setList(List list){
        list.add("1234");
        list.add(123);
    }
    public static void main(String[] args){
        //两个类型相同
        Class c1=new ArrayList<String>().getClass();
        Class c2=new ArrayList<Integer>().getClass();
        System.out.println(c1 == c2);

        List<String> list1=new ArrayList<>();
        List<Integer> list2=new ArrayList<>();
        list1.add("23");
        //以下代码编译不通过
//        list1.add(123);
        list2.add(123);
//        list2.add("123");
        ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
        erasedTypeEquivalence.setList(list1);
        erasedTypeEquivalence.setList(list2);
        System.out.println("list1:");
        //类型变化
        for (String o:list1){
            System.out.println(o.getClass().getName());
        }
        System.out.println("list2:");
        for (Object o:list2){
            System.out.println(o.getClass().getName());
        }
        System.out.println(list1+"--"+list2);
    }
}

输出

true
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
list1:
	at generics.ErasedTypeEquivalence.main(ErasedTypeEquivalence.java:28)
java.lang.String
java.lang.String

测试3

package generics;

import java.util.ArrayList;
import java.util.List;

public class ErasedTypeEquivalence {
    private void setList(List list){
        list.add("1234");
        list.add(123);
    }
    public static void main(String[] args){
        //两个类型相同
        Class c1=new ArrayList<String>().getClass();
        Class c2=new ArrayList<Integer>().getClass();
        System.out.println(c1 == c2);

        List<String> list1=new ArrayList<>();
        List<Integer> list2=new ArrayList<>();
        list1.add("23");
        //以下代码编译不通过
//        list1.add(123);
        list2.add(123);
//        list2.add("123");
        ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
        erasedTypeEquivalence.setList(list1);
        erasedTypeEquivalence.setList(list2);
        System.out.println("list1:");
        //类型变化
        for (Integer o:list1){
            System.out.println(o.getClass().getName());
        }
        System.out.println("list2:");
        for (Object o:list2){
            System.out.println(o.getClass().getName());
        }
        System.out.println(list1+"--"+list2);
    }
}

结果:编译不通过

结论

可以看到,泛型检查仅在使用泛型的方法中起作用。

泛型在ArraryList内部中获取不到而且在编译后就被擦除,而且传入的类型被替换为Object。

参考:《Java编程思想》

猜你喜欢

转载自blog.csdn.net/weixin_43958969/article/details/89453877