目录
什么是泛型?
泛型:一种宽泛的类型,是JDK5及其以后的版本所引入的一种类型。
在Java语言中,不少会见到诸如像int、boolen这种基本数据类型,也会见到Integer、Boolen这种包装器类型的数据以及自定义数据类型。我们发现这些数据类型都是确定数据类型。而泛型不单单拘泥于这几种确定的数据类型,它可以根据实际情况需求变更为其中的某一种数据类型。例如:我们在使用List数组时,经常会见到这种使用方式:定义字符串数组 List<String> 、 定义整数数组 List<Integer> (这里注意不能用基本数据类型,详细解释在类型擦除),<>里定义的就是泛型,只不过在业务逻辑需要的时候发生了变化。
为什么会有泛型?
有人会质疑:Object类是所有类型的父类,那么我直接用Object类来定义Object[] 数组这样不就好了,哪里还需要什么泛型。我来举个例子就清楚了:
话说小明有一个 "百宝箱" ,里面可以装下任何他的东西:玩具、袜子、文具...等等。开始东西少的时候还比较方便,直到小明随着慢慢长大,自己的东西越来越多,使得他的箱子越来越满。这还不是致命的,最致命的是每当小明想找某样东西的时候,他就得做这样一件事情:从箱子里拿出一样物品,检查是不是他想要的,不是就再拿一个,重复检查....,可谓是费心又费力。然后小明想到了这样一个办法:他拿出好几个箱子,这个箱子贴上"玩具"标签,那个箱子贴上"文具标签"。就这样以后再有东西需要装进箱子里,小明就会根据标签找到指定的箱子,再想拿到这个物品,就再次找到这个箱子。
听完这个例子就会发现,虽然我们定义了一个Object[] 数组来存放数据,但是随着数据量的增多,这个数组里的东西就会变得杂乱无章,有人说,那就定义好几个Object[] 数组,每个数组仅存放一种类型的数据。那如果这样Object就失去了原有的作用,还倒不如直接定义具体类型的数组去使用,而且用Object[] 数组拿出来的数据难免需要进行强制类型转化变为需要的数据类型。这样我们的泛型就起到作用了。
如何使用泛型
类上声明泛型
格式:
public class Box<T>
声明了一个泛型类,泛型为T,可以在类中使用T作为变量的定义方式
// 泛型类
// 物品箱子
public class Box<T>{
private List<T> things = new ArrayList<>();
// 放物品
public void add(T t){
things.add(t);
}
// 取物品
public T get(int index){
return things.get(index);
}
}
当泛型类被实例化时,所有的T将转化成实例化的参数类型
/*
* 定义两个实体类
*/
public class Toy{
String name;
public Toy(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
public class Tool {
String name;
public Tool(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
Box<Toy> toyBox = new Box<>(); // 创建一个玩具箱子
toyBox.add(new Toy("Tom"));
toyBox.add(new Toy("Jerry"));
Box<Tool> toolBox = new Box<>(); // 创建一个工具箱子
toolBox.add(new Tool("螺丝刀"));
toolBox.add(new Tool("扳手"));
实例化后toyBox的Box类中的T就会变为Toy类型,toolBox会变为Tool类型
完整代码:
package com.software.demo15;
import java.util.List;
public class Run {
public static void main(String[] args) {
Box<Toy> toyBox = new Box<>(); // 创建一个玩具箱子
toyBox.add(new Toy("Tom"));
toyBox.add(new Toy("Jerry"));
Box<Tool> toolBox = new Box<>(); // 创建一个工具箱子
toolBox.add(new Tool("螺丝刀"));
toolBox.add(new Tool("扳手"));
}
// 泛型类
// 物品箱子
static class Box<T>{
private List<T> things = new ArrayList<>();
// 放物品
public void add(T t){
things.add(t);
}
// 取物品
public T get(int index){
return things.get(index);
}
}
static class Toy{
String name;
public Toy(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
static class Tool {
String name;
public Tool(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
}
方法上声明泛型
下面我将举一个工具类的例子
定义一个工具类:
public class Utils
在工具类里定义一个方法:将多个泛型元素转化为列表
// 泛型可变参数方法:将多个元素转换为列表
@SafeVarargs
public static <T> List<T> asList(T... elements) {
List<T> list = new ArrayList<>();
Collections.addAll(list, elements);
return list;
}
当我们在方法前声明<T> ,那么此方法就会声明为泛型方法,T在该方法中作为参数类型。
完整代码:
package com.software.demo15;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Run {
public static void main(String[] args) {
List<String> lbw = Utils.toList("番茄炒河粉", "番茄炒米粉");
}
static class Utils{
public static <T> List<T> toList(T... elements) {
List<T> list = new ArrayList<>();
Collections.addAll(list, elements);
return list;
}
}
}
接口上声明泛型
interface List<E> {
E get(int index);
}
这是蒟蒻第一次写博客,若有不足,还请见谅 。


被折叠的 条评论
为什么被折叠?



