推荐课程—>B站黑马点这里
======================================================================
泛型其实就是一种参数化的集合,它限制了你添加进集合的类型。泛型标志就是一种参数化类型。多态也可以看作是泛型的机制。一个类继承了父类,那么就能通过它的父类找到相应的子类,但是不能通过其他类来找到具体要找的这个类。泛型的设计之处就是希望对象或方法具有最广泛的表达能力。
下面看一个例子说明没有泛型的用法:
List arrayList = new ArrayList();
arrayList.add("cxuan");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
System.out.println("test === ", item);
}
这段程序不能正常运行,原因是Integer类型不能直接强制转换为String类型。查询运行后显示报错:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
我们用泛型进行改写后,示例代码如下:
List arrayList = new ArrayList();
arrayList.add(100);
这段代码在编译期间就会报错,编译器会在编译阶段就能帮我们发现类似这样的问题。
2.1用泛型表示类
泛型可以加到类上面,来表示这个类的类型。
定义格式:
修饰符 class 类名<代表泛型的变量> { }
//此处T可以随便写为任意标识,创建的T,E,K,V等形式的的参数常用于表示泛型
public class Student {
//value这个成员变量的类型为T,T的类型由外部指定
private T value;
public Student(T value) {
this.value = value;
}
public Student() {
}
//泛型方法getKey的返回值类型为T,T的类型由外部指定
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
2.2用泛型表示接口
泛型接口与泛型的定义及使用基本相同。
一般泛型接口常用于
生成器(generator)中,生成器相对于对象工厂,是一种专门用来创建对象的类。
定义格式:
修饰符 interface 接口名<代表泛型的变量> { }
//定义一个泛型接口
public interface Student{
public T ppp();
}
2.3用泛型表示方法
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
public class GenericMethods {
public void f(T x){
System.out.println(x.getClass().getName());
}
}
2.4泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
public class Hello {
public static void main(String[] args) {
List name = new ArrayList<>();
List age = new ArrayList<>();
List number = new ArrayList<>();
name.add("小皮皮");