Java中的泛型 (基础版)

目录

什么是泛型?

为什么会有泛型?

如何使用泛型        

类上声明泛型

方法上声明泛型

接口上声明泛型

什么是泛型?

       泛型:一种宽泛的类型,是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);
}

这是蒟蒻第一次写博客,若有不足,还请见谅 。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值