Java泛型

java泛型


内容脑图大纲
泛型

1. 什么是泛型

个人理解:泛型,就是泛型(嘿嘿嘿)。泛型是一种程序设计思想,使用类型化参数,目的是为了提供更通用的程序代码。最典型的就是Java的容器了。
以下是百科:

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

吐槽:总觉得官方定义就是想把一个本来能够理解的东西,用一堆名词来解释,然后搞得不是那么容易理解。(不过也是为了维护准确性)

2. 泛型的好处

//示例:
List<String>  list = new ArrayList();
List<Integer> list2 = new ArrayList();
  1. 提供更通用的代码,这是最大的好处了。我们可以声明容纳不同对象的List实例。而不需要重写List代码 (想想我们平时写的代码,大多时候只要参数类型变化了。我们就需要修改代码了)
  2. 较好的安全性和可读性。安全性体现在当我往 list.add(1), 会编译报错,如果是Idea会直接提示报错。将而不是再运行时候报错,将报错提前,体现了较好的安全性。可读性体现在,阅读代码可以直接看出list是存储String类型,而list2存储Integer类型

额外知识点:

  • 自动装箱和拆箱:Java会更具需要将基本数据类型转化成包装类型。或将其包装类型拆成基本数据类型(为什么不用不能用int在下面介绍缺陷的地方介绍)
  • 注意包装类型都是final修饰的
  • 源码及远离(本来想介绍下,alt+鼠标左键 发现源码里面东西太多,溜了溜了。可以自己去看)

3. 如何设计泛型

  1. 简单泛型类
package com.java.datastructure;

public class Node<T> {
    //域
    public Node<T> pre;
    public Node<T> next;
    public T data;
    //构造器
    public Node(){}
    public Node(Node<T> pre, T data, Node<T> next){
        this.pre = pre;
        this.data = data;
        this.next = next;
    }
}

下面一行就是我定义的简单泛型类(没错,我今天还是写链表链表来示例。昨天的单链表)下面是元组的形式,其实和上面是一样的,不过链表存储了两种不同的数据类型,我写是用是上面的

public class Node<T>{}
public class Node<T,U>{}
  1. 泛型方法
  • 泛型方法可以在泛型类中,也可以在非泛型类中
  • 可以是静态的也一个是非静态的
  • 注意写法的不同,可以就认为方法就是普通的一样,只不过参数类型是泛型的
//泛型方法在泛型类中
class Test<T>{
    //普通方法
    public T get(T a){
        return a;
    }
    //泛型方法
    public static <T> T set(int a){
        return null;}
}
//泛型方法在非泛型类中
class Cat{
    //普通方法
    public <T> T get(T a){
        return a;
    }
    //泛型方法
    public static <T> T set(T a){
        return a;
    }
}
  1. 类型变量限定
class Stack<T extends Number>{}
//错误用法示范
Stack<String> stack = new Stack<>();
//正确使用示范
Stack<Integer> stack = new Stack<>();

表示使用的时候,只能声明为Number的子类使用。上面的那种因为String不是Number的子类,导致编译为报错,IDEA会直接红X提示的
5. 反射和泛型
这部分我自己也没有理解透,又好的文章请给我推荐下,谢谢

4.泛型使用

  1. 普通使用
    这个没啥好说的,直接使用,使用时声明是什么类型,这样就只能将什么可惜传递进去,限制进入,如果传递其他类型,会直接报错,这就是安全性的体现了
List<String> list = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
  1. 泛型通配符
    这个是高级用法 ? super B 用来写数据 ?extends B用来读取数据
    用法和我原先的预想有出入。先放置后续更新
    与类型变量限定的比较 T extends Number仅仅是像而已,一点关系没有,类型变量限定是定义泛型用的,通配符是用来使用泛型的
        List<? super B> list1 = new ArrayList<>();
        List<? extends B> list2 = new ArrayList<>();

5. 泛型的原理以及缺陷

  1. 泛型原理:Java的虚拟机是不支持泛型的,用《java编程思想》那本书的作者吐槽的,Java是假泛型。Java泛型原理专业术语叫 类型擦除:编译器会将泛型代码编译成Object类型(为什不能用int的原因)或其原始类型
  2. 泛型缺陷
    • 不能用基本数据类型实例化类型参数 类型擦除导致的 int 不是Object
    • 不能用new T() 类型擦除导致的,我们肯定不是想new Object()
    • 其他缺陷,就这上面两个理解的好,其他的我理解的不透彻,我就不写了 可以看《Java核心技术》

6. 泛型设计实例

7. 总结

  1. 知道什么是泛型,以及其好处
  2. 知道怎么使用(容器)
  3. 泛型的原理是 类型擦除
  4. 因为类型擦除会给泛型带来一些却笑
  5. 泛型限定符
  6. 泛型通配符
    其实知道1,2,3基本就够用了因为日常使用,真正需要设计泛型的时候不多见,一般人都是使用容器类的时候才用到泛型。而且很少需要去设计泛型

题外话

  • 每次设计到一个知识点,总是要想想明白几个问题:1.是什么?2.有什么好处?3.怎么使用?4.有什么缺陷5.实现原理
  • 带着一些问题去看,这样效果会好很多,主要是知道自己想要什么,而不是被灌输,效果会好很多。没必要去看很多洋洋洒洒的一大堆。知道自己要什么就很好了
  • 我才发现我每次的脑图都有个Xmind试用版,搞得给人家打广告一样,但是真的没有利益关系。只想白嫖。不知道有没有人给我推荐个好用的脑图工具
  • 每次写博客感觉都会花掉不少时间,而且不知道怎么去讲。今天不能像昨天的链表那样死刚,时间超过得太多了。复习效率太低,先搭个架子。后续要需要在回来补,先敏捷后迭代才行,写个博客修改起来不会太麻烦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值