泛型的基本概念和用法

泛型是在编译阶段 限制 类型 就是为 泛型指定的类型

概念

Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型是一种把类型的明确工作推迟到创建对象或者调用方法的时候才去明确的特殊类型。

注意:类型参数只能代表引用类型,不能是原始类型(像int,double,char等)。

泛型可以使用在方法、接口、类 分别称作为:泛型类、泛型方法、泛型接口。

泛型类

泛型类定义的格式:

格式:修饰符 class 类名<类型>{ }

范例: public class Mayikt{ }

此处T可以随便写为任意标识,T,E,K,V等形式的参数常用于表示泛型;

示例

public class Mayikt{
    private T t;
    /*
    泛型类型格式:public  class  Mayikt{}
    private T t;
    也就是  在类中定义的成员属性  泛型  T  类型  与我们在类上定义泛型类型是相同的
     */
    public T getT() {
        return t;
    }
    public void setT(T t) {
        this.t = t;
    }
    public static void main(String[] args) {
        Mayikt t = new Mayikt<>();
        t.setT("test");
        System.out.println(t.getT());
        Mayikt i = new Mayikt<>();
        i.setT(521);
        System.out.println(i.getT());
        Mayikt d = new Mayikt<>();
        d.setT(10.00);
        System.out.println(d.getT());
    }
}
___________________________________________________________________________________________________
test
521
10.0
进程已结束,退出代码0

泛型方法

格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){ }

范例:public void show(T t){ }

public class Mayikt{
    /*
     格式:修饰符<类型>  返回值类型   方法名(类型   变量名){  }
     范例:public void  show(T  t){  }
     */
    public  T show(T t){
        return t;
    }
    public static void main(String[] args) {
        Mayikt m = new Mayikt();
        System.out.println(m.show("m"));
        System.out.println(m.show(true));
        System.out.println(m.show(10.10));
        System.out.println(m.show(520));
    }
}
____________________________________________________________________________________________________________
m
true
10.1
520
进程已结束,退出代码0

泛型接口

格式:修饰符 interface 接口名<类型>{ }

范例:public interface MayikeInterface{ }

public interface MayikeInterface {
    T show(T t);
}
//没有指定泛型实现接口实现方法为Object类
class MayiktImpl1 implements MayikeInterface{
    @Override
    public Object show(Object o) {
        return null;
    }
}
class MayiktImpl2 implements MayikeInterface{
    @Override
    public T show(T t) {
        return t;
    }
}
class MTest{
    public static void main(String[] args) {
        MayiktImpl2 test = new MayiktImpl2<>();
        System.out.println(test.show("HYL"));
    }
}
__________________________________________________________________________________________________________
HYL

利用泛型模仿ArrayList

public interface MayiktList{
    void add(E e);
    E get(int index);
}
class MayiktArrayList implements MayiktList{
​
    @Override
    public void add(E e) {
        System.out.println("新增成功");
    }
​
    @Override  
    public E get(int index) {
        System.out.println("查询成功");
        E e = null;
        return e;
    }
}
class MTest{
    public static void main(String[] args) {
        MayiktList stringMayiktList = new MayiktArrayList<>();
        stringMayiktList.add("HYL");
    }
}

泛型的类型通配符

  1. 类型通配符 一般用于接收使用,不能够做添加

  2. List :表示元素类型未知的 list,它的元素可以匹配任何类型

  3. 带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中。

  4. 类型通配符上限:List ——》List :它表示的类型是MayiktParent或者子类型。

  5. 类型通配符下限:List ——》List :它表示的类型是MayiktParent或者其父类类型。

public class Test01 {
    /*
    * 定义的printList方法  明确知道  接收具体list泛型 是什么类型
    * List 只能够用于接收  ?——————可以接收所有的泛型类型,但是不能用于添加
    * 可以做get操作  获取到的类型为Object
    */
    public static void printList(List list){
        //list.add("ss");   //用于添加会报错
        //Object o = list.get(1);//用于接收get()方法的类型为Object
        Iterator iterator = list.iterator();
        //遍历传过来的list
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add("i:"+i);
        }
        printList(list);
    }
}
____________________________________________________________________________________________________________
i:0
i:1
i:2
i:3
i:4
进程已结束,退出代码0

类型通配符上下限

public class Test01 {
    public static void main(String[] args) {
        ArrayList mayiktParents = new ArrayList<>();
        ArrayList students = new ArrayList<>();
        ArrayList objects = new ArrayList<>();
        printList1(mayiktParents);
        printList1(students);
        //printList1(objects); //不能接收Object类型,编译直接报错
        printList2(mayiktParents);
        //printList2(students);  //不能接收其子类类型,编译直接报错
        printList2(objects); //可以接收MayiktParent的父类Object
    }
    /*
      类型通配符上限和下限
      上限
      List list 上限  MayiktParent类型和它的子类都是可以接收的
    */
    public static void printList1(List list){
​
    }
    /*
      下限
      只能接收List泛型类型 MayiktParent或者其父类类型 
    */
    public static void printList2(List list){
​
    }
}
class Student extends MayiktParent{
}
class MayiktParent {
}

擦除机制

public class Test01 {
    public static void main(String[] args) {
        // 泛型原理  底层  使用擦除机制
        // 泛型 是在编译阶段限制传递的类型
        List strs = new ArrayList<>();
        strs.add("HYL");//储存的是String类型
        /*
        说明: 将一个List集合赋值给一个没有使用到泛型的List集合
        直接去除泛型————》擦除机制
       */
        List list = strs;
        list.add(123);//储存的是Objec类型
        /*
        泛型  是在编译阶段限制传递的类型  在运行阶段都是擦除的
        class文件在运行  里面是没有  泛型
        Java源代码——》编译成class文件  xjad工具用作反编译,将.class文件反编译成.java源代码
        反编译成.java文件泛型会全部擦除,变成Objec类
        */
    }
}

你可能感兴趣的:(Java,java,jvm,开发语言)