java泛型的学习

1.什么是泛型

1.1泛型是jdk5中引入的一个新特性,它提供了编译时类型安全机制检测,允许我们编译时检测非法类型数据结构,例子如下

import java.util.ArrayList;

import static javax.swing.UIManager.get;

public class Test2 {
    public static void main(String[] args) {
    //这里编译时不会报错,但运行时会报数据类型转换错误
//        ArrayList list=new ArrayList();
//        list.add("java");
//        list.add(100);
//        list.add(true);
//        for (int i=0;i<list.size();i++){
//            Object o = list.get(i);
//             String ste=(String)o;
//            System.out.println(ste);
//        }

        //泛型
        //编译期间检查类型
        //无需数据类型装换
        ArrayList<String>list2=new ArrayList<>();
        list2.add("aeawewa");
        list2.add("b");
        //编译期间检查数据类型,添加int型数据会报错,避免了运行时错误
        //list2.add(123);
        list2.add("c");
        for (int i = 0; i < list2.size(); i++) {
            String s= list2.get(i);
            System.out.println(s);
        }
        System.out.println("_-------------------------_");
        ArrayList<Integer>list3=new ArrayList<>();
         list3.add(12);
         list3.add(234);
        for (int i = 0; i <list3.size() ; i++) {
              //自动拆装箱
                 int num=list3.get(i);
            System.out.println(num);
        }

    }
}
复制代码

2.泛型类和接口

2.1泛型的定义语法

class 类名<泛型标识,泛型标识--->{
  private 泛型标识 变量名;
  ----
}

复制代码

2.2常用的泛型标识符有:T,E,K,V

2.3简单泛型类定义实例

public class Gneeric<T> {
 
   private T key;
  //构造方法参数类型
  //T的类型是有外部使用类来指定
   public Gneeric(T key) {
       this.key = key;
   }

   public T getKey() {
       return key;
   }

   public void setKey(T key) {
       this.key = key;
   }

   @Override
   public String toString() {
       return "Gneeric{" +
               "key=" + key +
               '}';
   }
}
复制代码

2.3泛型类的使用语法

  类名<具体的数据类型> 对象名=new 类名<具体的数据类型>();
  
  在Java1.7之后,new后面<具体数据类型>可以不写
  类名<具体的数据类型> 对象名=new 类名<>();
  
  泛型类不支持基本数据类型
  //Gneeric<int>=new Gneeric<>(1212);    
----------------------------------------------------------
public class ManTest {
    public static void main(String[] args) {
        //在创建对象时就要给泛型标识指定具体的数据类型,这里我指定了String
        Gneeric<String> gneeric=new Gneeric<>("adawddwadwa");
         String  key1 =  gneeric.getKey();
        System.out.println("Key1="+key1);//Key1=adawddwadwa

        Gneeric<Integer> gneeric1=new Gneeric<>(123);
            int key2=gneeric1.getKey();
        System.out.println ("key2="+key2);//key2=123
        
        //泛型类在创建对象的时候是没有指定数据类型,将按照object类型操作
        Gneeric gneeric2=new Gneeric<>("awewaea");
        Gneeric gneeric3=new Gneeric<>(12121);
         Object key4 =gneeric3.getKey();

    }
}
复制代码

2.4泛型类派生的子类,父子类的泛型类型要一致

class A<T> extends B<T>
复制代码

2.5子类不是泛型类,父类要明确泛型的数据类型

class A extends B<String>
复制代码

注意:

泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。
  if(ex_num instanceof Generic){ }

2.6泛型接口定义语法

interface 接口名称<泛型标识---->{
泛型标识 方法名();
----
}
复制代码

注意

实现类不是泛型类,接口要明确数据类型

实现类也是泛型类,那么泛型类型要一致

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享