Java基础之泛型

2020-07-22  本文已影响0人  felixfeijs

Java基础之泛型

泛型基本介绍

  1. 简单介绍
    • 在jdk1.6之前,还没有使用到泛型,Java类型分为原始类型、复杂类型,其中复杂类型分为数组和类。要在类中的方法支持多个数据类型就需要进行方法重载,在引入泛型侯可解决此问题(多态).
    • 引入泛型主要为了解决两个方面的问题
      1. 集合类型元素在运行期出现类型转换异常,引入泛型增加编译时类型的检查.
      2. 解决开发时重复代码的编写,能够复用方法.
  2. 泛型中T、E、K、V、?的含义
    • E - Element (在集合中使用,因为集合中存放的是元素),E是对各方法中的泛型类型进行限制,以保证同一个对象调用不同的方法时,操作的类型必定是相同的。E可以用其它任意字母代替
    • T - Type(Java 类),T代表在调用时的指定类型。会进行类型推断
    • K - Key(键)
    • V - Value(值)
    • N - Number(数值类型)
    • ? - 表示不确定的java类型,是类型通配符,代表所有类型。?不会进行类型推断

泛型的使用

  1. 使用泛型指定入参类型
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        // list.add(213); 使用其他类型会编辑报错
    }
    
  2. 使用泛型类
    1. 定义泛型类
    public class User<T> {
    
    public T getContent() {
        System.out.println("Object的类型为=" + this.content.getClass().getName());
        return content;
    }
    
    public void setContent(T content) {
        this.content = content;
    }
    
    public User(T content) {
        this.content = content;
    }
    
    private T content;
    
    }
    
    1. 进行构造方法调用
        public static void main(String[] args) {
        User<String> userStr = new User<String>("哈哈");
        System.out.println("输入的内容="+userStr.getContent());
        User<Integer> userInt = new User<Integer>(123);
        System.out.println("输入的内容="+userInt.getContent());
    }
    
    • 控制台结果
    Object的类型为=java.lang.String
    输入的内容=哈哈
    Object的类型为=java.lang.Integer
    输入的内容=123
    
  3. 限制泛型为继承某个类的子类
    1. 编写用户类
    public class User {
    
    private String name;
    private Integer age;
    private String sex;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getAge() {
        return age;
    }
    
    public void setAge(Integer age) {
        this.age = age;
    }
    
    public String getSex() {
        return sex;
    }
    
    public void setSex(String sex) {
        this.sex = sex;
    }
    
    public void say() {
    
    }
    }
    
    1. 编写Boos类
    public class Boos extends User {
    
    @Override
    public void say() {
        System.out.println("姓名:" + this.getName() + "、性别:" + this.getSex() + "年龄:" + this.getAge() + "职位:领导");
    }
    }
    
    1. 编写Personnel类
    public class Personnel extends User {
    
    @Override
    public void say() {
        System.out.println("姓名:"+this.getName()+"、性别:"+this.getSex()+"年龄:"+this.getAge()+"职位:员工");
    }
    }
    
    1. 编写泛型类
    public class Demo<T extends User> {
    public T getContent() {
        return content;
    }
    
    public void setContent(T content) {
        this.content = content;
    }
    
    private T content;
    
    public Demo(T content){
        this.content = content;
        System.out.println("输入的类型是="+content.getClass().getName());
    }
    }
    
    1. 编写测试类
        public static void main(String[] args) {
        Boos boos = new Boos();
        boos.setName("范先生");
        boos.setAge(20);
        boos.setSex("男");
        boos.say();
        Demo<Boos> boosDemo = new Demo<>(boos);
        System.out.println("boosDemo的内容="+boosDemo.getContent());
    
        Personnel personnel = new Personnel();
        personnel.setName("赵先生");
        personnel.setAge(21);
        personnel.setSex("男");
        personnel.say();
        Demo<Personnel> personnelDemo = new Demo<>(personnel);
        System.out.println("personnelDemo的内容="+personnelDemo.getContent());
    }
    
    • 控制台结果
    姓名:范先生、性别:男年龄:20职位:领导
    输入的类型是=com.example.demo.test.Boos
    boosDemo的内容=com.example.demo.test.Boos@5ca881b5
    姓名:赵先生、性别:男年龄:21职位:员工
    输入的类型是=com.example.demo.test.Personnel
    personnelDemo的内容=com.example.demo.test.Personnel@24d46ca6
    
  4. 使用通配符泛型
    1. 创建Boos类
    public class Boos {
    
    public Boos(String name, Integer age, String sex) {
        System.out.println("姓名:" + name + "、性别:" + sex + "年龄:" + age + "职位:领导");
    }
    }
    
    1. 创建Personnel类
    public class Personnel{
    
    public Personnel(String name,Integer age,String sex){
        System.out.println("姓名:" + name + "、性别:" + sex + "年龄:" + age + "职位:领导");
    }
    }
    
    1. 进行测试
        public static void main(String[] args) {
        Demo<Integer> integerDemo = new Demo<>(123);
        TestTwo.take(integerDemo);
        Demo<Boos> boosDemo = new Demo<>(new Boos("张先生",23,"男"));
        TestTwo.take(boosDemo);
        Demo<Personnel> personnelDemo = new Demo<>(new Personnel("吴女士",24,"女"));
        TestTwo.take(personnelDemo);
    
    }
    
    • 控制台结果
    输入的类型是=java.lang.Integer
    输出的内容是=123
    姓名:张先生、性别:男年龄:23职位:领导
    输入的类型是=com.example.demo.test.Boos
    输出的内容是=com.example.demo.test.Boos@5ca881b5
    姓名:吴女士、性别:女年龄:24职位:领导
    输入的类型是=com.example.demo.test.Personnel
    输出的内容是=com.example.demo.test.Personnel@24d46ca6
    
  5. 使用泛型方法
    1. 创建方法并进行方法调用
        public static <T> void print(T content) {
        System.out.println("输出的内容是=" + content);
        System.out.println("输出的类型是=" + content.getClass().getName());
    }
    
    public static void main(String[] args) {
        TestTwo.print(123);
        TestTwo.print("哈哈");
        TestTwo.print(236.63);
        TestTwo.print(1.0f);
        TestTwo.print(new Object());
    }
    
    • 控制台结果
    输出的内容是=123
    输出的类型是=java.lang.Integer
    输出的内容是=哈哈
    输出的类型是=java.lang.String
    输出的内容是=236.63
    输出的类型是=java.lang.Double
    输出的内容是=1.0
    输出的类型是=java.lang.Float
    输出的内容是=java.lang.Object@5ca881b5
    输出的类型是=java.lang.Object
    

泛型加深理解

  1. 泛型语法相当于一个语法糖,通过编译器编译后生成的.class文件完全相同.
上一篇 下一篇

猜你喜欢

热点阅读