Java泛型及instance of关键字实现原理

Java泛型生效是在编译阶段,用来做一些参数上的约束。
 

    public static void main(String[] args){
        List list = new ArrayList<>();
        list.add("111");//插入字符传
        list.add(111);//插入整数
        for(int i =0,len = list.size();i

这个时候编译的时候并不会报错 ,但是运行时会报错  Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 。为了做出约束,这个时候我们可以使用泛型
 

        //List list = new ArrayList<>();
        List list = new ArrayList<>();

将List加上泛型的约束,则list.add()只能添加String了。
 

泛型擦除:是指编译过后,所有的泛型都会被抹除,只剩下原始类型,当原始类型没有约束时,就用Object代替

    public static void main(String[] args) {
        ArrayList list1 = new ArrayList();
        list1.add("abc");

        ArrayList list2 = new ArrayList();
        list2.add(123);
        System.out.println(list1.getClass() == list2.getClass());
    }

在编译过后 list1和list2都会变成List JVM 不会关注里面的是什么,相当于List


泛型约束:用super或者extend来约束

        List a = new ArrayList();
        List b= new ArrayList();

泛型本身是不能够支持类型转化的

        List a = new ArrayList();//编译错误
        List b= new ArrayList();//编译错误

显示的转化也是不行的

       List a = new ArrayList<>();
       List b = new ArrayList<>();
       a = b;//编译报错
       b = (List)a;//编译报错 
  

泛型也是不能够instand of的 因为泛型擦出后 jvm没办法判断类型

        List list = new ArrayList<>();
        if(list instanceof List){//编译爆错
            
        }

因为instance of的实现原理就是类型转化

boolean result;
if (obj == null) {
  result = false;
} else {
  try {
      T temp = (T) obj; 
      result = true;
  } catch (ClassCastException e) {
      result = false;
  }
}

泛型的约束在编译的时候起作用,实际类型运行时才能确认。

泛型在类上的使用 此时类里面的所有方法都可以使用此泛型,但是静态方法不行,静态方法在类加载的时候就确认了,但是泛型需要具体对象出来的时才能确认

public  class Generic {
  public void test(T e){
      if(e instanceof Number){
          System.out.println("number");
      }
  }
}

静态方法也是能用泛型的,但是必须要在方法上申明。此时使用的就是方法上定义的泛型

  public static void show(T e){
      
  } 

 

你可能感兴趣的:(Java基础)