今天开始准备简历项目,也就是快烂大街的rpc
学习内容:
在这里先感谢Guide哥提供大伙的思路:
https://github.com/CN-GuoZiyang/My-RPC-Framework;
然后是声哥写的更加通俗易懂版本:
https://github.com/CN-GuoZiyang/My-RPC-Framework;
最后是一位牛客老哥分享的注释版(饭喂到嘴边那种):https://github.com/IAMPadA/Panda-Rpc-Framework/tree/master
可惜菜鸡如我就算是对着别人的项目敲还是会有很多东西迷迷糊糊的,咦这个<>是个啥玩意,哦好像之前javaSE的时候听康师傅讲过叫泛型,那里面再加个问号又是啥???
OK今天的项目到此结束,咱先去把泛型整整明白吧,不然一个方法都写得够呛
学习产出:
经过了牛客、CSDN、以及康师傅的又一次洗礼,大概是把泛型搞清楚了,顺带还把常见面试题也看了一下,这里推荐一个讲得比较全的博客:
https://blog.csdn.net/s10461/article/details/53941091?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164527353216780255238521%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164527353216780255238521&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-53941091.first_rank_v2_pc_rank_v29&utm_term=%E6%B3%9B%E5%9E%8B&spm=1018.2226.3001.4187
我的总结大致如下:
泛型又叫“参数化类型”,就是在定义类、接口、方法的时候指定某一种特定类型,让类、接口、方法的使用者来决定具体用哪一种类型的参数。
Java的泛型是在1.5引入的,只在编译期做泛型检查,运行期泛型就会消失,我们把这称为“泛型擦除”,最终类型都会变成 Object。在没有泛型之前,从集合中读取到的每一个对象都必须进行类型转换,如果不小心插入了错误的类型对象,在运行时的转换处理就会出错,有了泛型后,你可以告诉编译器每个集合接收的对象类型是什么,编译器在编译期就会做类型检查,告知是否插入了错误类型的对象,使得程序更加安全,也更加清楚。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。
泛型类写法:
类名<T>
其中T代表一个类型名称,可以随便写,而在实例化时则必须要表明具体的类型,泛型的类型参数只能是类类型(包括自定义类),不能是简单类型,即不能是int,而是Integer。
同时注意:在静态方法中不能使用类的泛型,可以理解为静态结构要早于类的创建,而泛型是在实例化时才知道类型,因此会报错;另外异常类也不能是泛型的。
多类型时声明方式为:类名<T1,T2>
泛型接口:与泛型类基本一致,区别在于子类在继承泛型接口的时候需要接口处声明泛型类型,否则编译器报错。
泛型方法:即在方法中出现了泛型的结构,与之前不同的是,泛型方法可以声明为静态的,因为泛型参数是在调用方法时确定的,而不是实例化,通常的定义方式为:
如public <T> List<T> add(T[] arr)
泛型在继承方面,若A是B的父类,G<A>
和G<B>
不具有父子关系,而是并列关系。
最后是通配符“?”的使用,可以先把它简单理解为两个泛型的一个共同父类,即上面AB的共同父类为G<?>,
但是不能向里面添加任何数据(NULL除外),类似于抽象类。
上面的是无界通配符,也就是没有限制条件,另外还有一种有限制条件的通配符,
可以简单理解为:extends T只允许泛型为T的类及其子类调用
super T只允许泛型为T的类及其父类调用
大概好像八成就是这么多,人都麻了,空了再回头看看有没有地方写错了