前面简单提了一下泛型,但是并不是很详细,这篇博客再详细的介绍下:
在java中有些时候,我们在定义的时候不知道会使用什么类型,直到使用的时候才会确定使用的类型是什么。在这种情况下,如果直接使用object ,在使用中,可能会涉及到类型强转的问题。但是只要涉及到强转就可能会出现强转异常(ClassCastException,强转只能说子类的对象指向父类引用的时候,这个引用对象可以强转为该子类)。在这种情况下java支持了泛型这个概念。泛型主要分为类泛型和方法泛型,接下来逐一介绍:
先来介绍一下类泛型
先举个例子,当我们百度的时候,可以看一下数据量:

这个数据量有六千七百多万,试想如果百度每次搜索都把数据全部给出来,那这个数据量可以想象一下。如果一个人搜索完了要六千万数据,那么百度的用户量我们就限定为只有10万个人搜索把,那这一次下来就是:一万个亿的数据。那么百度有那么庞大的服务器吗?就算有这个成本也太高了点吧。
所以这里就有一个解决方案如下:

就是分页机制,百度只是告诉你有六千多万的结果,但是每页只会显示十几个数据结果。那这相比上面就好太多了就算有100万人同时访问。那最多也就是同时又1000万条数据,也比上面的一万个亿小太多了。
这里就用类泛型的知识,来书写一个分页的类,请仔细阅读下方代码的注释
package generics;
import java.util.List;
/**
* @author Hercules
* @version 创建时间:2020年5月26日 上午9:59:27
* @param <T> 表示一个泛型的类型 只是单纯的起了一个类型替代的作用
*
* T的作用范围就仅限于当前这个类的内部
如果有多个泛型的时候用","隔开
public class Pager<T,Y,Z>
*/
public class Pager<T> {
private int totalCount;//分页时总共有多少条数据
private int pageSize;//每页显示多少条数据
private int pageNow;//当前是第几页
private int pageCount;//总共多少页
private List<T> datas;
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
}
在上述代码中这一段是最重要的:
private List<T> datas;
这一段代码代表的是每一页中的数据数组,但是页面的数据是不一样的就以百度为例,比如搜索一个java

每条的数据应该是差不多的有标题属性,有内容,网址,百度快照等。
但是当把百度的筛选从网页调到视频呢:

可以看到这时候每条数据有简介,分钟数,以及视频图片等。然而网页类的数据都没有这些属性,所以这里必须要有一个泛型,用来支持。这就是类泛型的内容。
接下来介绍方法泛型,比如说:
下面来定义一个泛型方法,该方法负责将一个Object数组的所有元素添加到一个Collection集合中。考虑使用如下代码实现该方法。
static void fromArrayToCollection(Object[] a,Collection<Object> c) {
for(Object o:a) {
c.add(o);
}
}
上面定义的方法没有任何问题,关键在于c形参,它的数据类型是Collection<Object>。首先必须说明Collection<String>不是Collection<Object>的子类型。所以这个方法的功能非常有限,它只能将Object[]数组的元素复制到Object(Object的子类不行)的Collection集合中去,即下面的代码将引起编译错误。
String[] strArr = {"a","b"};
List<String> strList = new ArrayList<>();
//Collection<String>对象不能当做Collection<Object>使用,下面代码出现编译错误
fromArrayToCollection(strArr, strList);
采用支持泛型的方法可以将上述代码,改成如下格式
static <T> void fromArrayToCollection(T[] a,Collection<T> c) {
for(T o:a) {
c.add(o);
}
}
泛型界定
在定义泛型的时候如果直接写的话,那么该泛型可以描述所有类型
1109

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



