本文参考文章 https://www.cnblogs.com/lwbqqyumidi/p/3837629.html需要详细理解泛型的请跳转该文章
作者写的很棒,本萌新作为一个初学黑宝书《 java数据结构和算法分析》的人
本书中提到的泛型并没有看懂但是参考该作者文章,初步理解了泛型,作为记录
一.Java泛型的意义,为什么需要泛型:
例如定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。而使用泛型就可以避免这种问题。
public class GenericTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); // 1
System.out.println("name:" + name);
}
}
}
二.什么是泛型?
我的理解就是一个在接口或类或方法定义时限制传入数据的类型,使用泛型后在 //1 处会报错,在编译的时候就能够发现传入数据的错误。
public class GenericTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("qqyumidi");
list.add("corn");
//list.add(100); // 1 提示编译错误
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2
System.out.println("name:" + name);
}
}
}
二.我们自己如何编写泛型程序
自定义泛型接口、泛型类和泛型方法实例
T代表了传入的数据类型
public class GenericTest {
public static void main(String[] args) {
Box<String> name = new Box<String>("corn");
System.out.println("name:" + name.getData());
}
}
class Box<T> {
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
三.类型通配符
类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类。由此,我们依然可以定义泛型方法,来完成此类需求。
同时类型通配符还有着上限和下限
对类型实参又有进一步的限制:只能是Number类及其子类。此时,需要用到类型通配符上限。
此时,显然,在代码//1处调用将出现错误提示,而//2 //3处调用正常。
public class GenericTest {
public static void main(String[] args) {
Box<String> name = new Box<String>("corn");
Box<Integer> age = new Box<Integer>(712);
Box<Number> number = new Box<Number>(314);
getData(name);
getData(age);
getData(number);
//getUpperNumberData(name); // 1
getUpperNumberData(age); // 2
getUpperNumberData(number); // 3
}
public static void getData(Box<?> data) {
System.out.println("data :" + data.getData());
}
public static void getUpperNumberData(Box<? extends Number> data){
System.out.println("data :" + data.getData());
}
}