Java基础之泛型
2020-07-22 本文已影响0人
felixfeijs
Java基础之泛型
泛型基本介绍
- 简单介绍
- 在jdk1.6之前,还没有使用到泛型,Java类型分为原始类型、复杂类型,其中复杂类型分为数组和类。要在类中的方法支持多个数据类型就需要进行方法重载,在引入泛型侯可解决此问题(多态).
- 引入泛型主要为了解决两个方面的问题
- 集合类型元素在运行期出现类型转换异常,引入泛型增加编译时类型的检查.
- 解决开发时重复代码的编写,能够复用方法.
- 泛型中T、E、K、V、?的含义
- E - Element (在集合中使用,因为集合中存放的是元素),E是对各方法中的泛型类型进行限制,以保证同一个对象调用不同的方法时,操作的类型必定是相同的。E可以用其它任意字母代替
- T - Type(Java 类),T代表在调用时的指定类型。会进行类型推断
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的java类型,是类型通配符,代表所有类型。?不会进行类型推断
泛型的使用
- 使用泛型指定入参类型
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); // list.add(213); 使用其他类型会编辑报错 }
- 使用泛型类
- 定义泛型类
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; }
- 进行构造方法调用
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
- 限制泛型为继承某个类的子类
- 编写用户类
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() { } }
- 编写Boos类
public class Boos extends User { @Override public void say() { System.out.println("姓名:" + this.getName() + "、性别:" + this.getSex() + "年龄:" + this.getAge() + "职位:领导"); } }
- 编写Personnel类
public class Personnel extends User { @Override public void say() { System.out.println("姓名:"+this.getName()+"、性别:"+this.getSex()+"年龄:"+this.getAge()+"职位:员工"); } }
- 编写泛型类
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()); } }
- 编写测试类
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
- 使用通配符泛型
- 创建Boos类
public class Boos { public Boos(String name, Integer age, String sex) { System.out.println("姓名:" + name + "、性别:" + sex + "年龄:" + age + "职位:领导"); } }
- 创建Personnel类
public class Personnel{ public Personnel(String name,Integer age,String sex){ System.out.println("姓名:" + name + "、性别:" + sex + "年龄:" + age + "职位:领导"); } }
- 进行测试
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
- 使用泛型方法
- 创建方法并进行方法调用
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
泛型加深理解
- 泛型语法相当于一个语法糖,通过编译器编译后生成的.class文件完全相同.