泛型
- 1、泛型
- 1.1 概述
- 【注意】
- 1.2 作用
- 1.3 泛型的功能
- 1.3.1 泛型类(***)
- 1.3.2 泛型接口
- 1.3.3 泛型方法
- 1.3.4 综合实例
- 1.4 限制泛型类型
- 1.5 泛型中的通配符
1、泛型
1.1 概述
什么是Java泛型?
泛型,即“参数化类型”。——一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
【注意】
在编译之后程序会采取去泛型化的措施。
- 也就是说Java中的泛型,只在编译阶段有效。
- 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段
1.2 作用
为什么要使用泛型?
- 提高代码复用率
- 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
按照这么理解,那泛型和object类型没啥区别呀!object类表示不具体的类型呢。那为什么优先考虑泛型,而不使用object?
通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),因为您可以重用数据处理算法,而无须复制类型特定的代码(可重用)
使用泛型比使用object的好处:
- 无须类型强转,提高效率,避免了强转出错。对于强制类型转换错误的情况,使用object编译器可能不提示错误,在运行的时候才出现异常【例如:我们通常通过parse***用于将String类型转换为基本数据类型,此时转化过程有可能出现格式化异常】,这是一个安全隐患。
- 通配符"?"的使用提高了程序的阅读性。
- 限制通配符(<? extends T>、<? super T>)提高了程序的健壮性。
1.3 泛型的功能
1.3.1 泛型类(***)
定义格式:
Demo2.java
public class Demo2 <T>{
private T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
Test.java
public class Test {
public static void main(String[] args) {
//确定的参数类型必须是包装类型,而不能是int、double、float...
Demo2<String> d1 = new Demo2<>();
Demo2<Integer> d2 = new Demo2<>();
d1.setName("爱摸鱼的TT~");
d2.setName(520);
System.out.println(d1.getName());
System.out.println(d2.getName());
}
}
运行结果:
1.3.2 泛型接口
泛型接口与类很相似,实现一个接口是否需要实现这个类型(说白了就是是否指定具体的类型)? 这就需要看需求。
public interface IntercaceName<T>{
T getData();
}
实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
指定类型:
public class Interface1 implements IntercaceName<String> {
private String text;
@Override
public String getData() {
return text;
}
}
不指定类型:
public class Interface1<T> implements IntercaceName<T> {
private T data;
@Override
public T getData() {
return data;
}
}
1.3.3 泛型方法
方法的类型是泛型,返回值也是泛型
private static <T> T 方法名(T a, T b) {}
例子:
运行结果:
1.3.4 综合实例
1,假设在定义时不确定类型,但使用时可以确定:2,测试方法
1.4 限制泛型类型
在使用泛型时, 可以指定泛型的限定区域 ,
- 例如: 必须是某某类的子类或 某某接口的实现类,格式:
<T extends 类 或 接口1 & 接口2>
1.5 泛型中的通配符
类型通配符是使用 ? 代替方法具体的类型实参。
- 1 <? extends Parent> 指定了泛型类型的上届
- 2 <? super Child> 指定了泛型类型的下届
- 3 <?> 指定了没有限制的泛型类型
上界限定(限定父类):表示使用的泛型只能是Parent类的子类或者本身
下界限定:表示使用的泛型只能是Child类的父类或者本身