什么是泛型
泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。
泛型的意义
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
泛型的定义
1.泛型类
写一个泛型类
import java.util.ArrayList;
public class Test {
//泛型类
static class MyArrayList<E> {
private ArrayList lists = new ArrayList();
public void add(E e){
lists.add(e);
}
public void remove(E e){
lists.remove(e);
}
@Override
public String toString(){
return lists.toString();
}
}
public static void main(String[] args) {
//模拟一个ArrayList定义一个MyArrayList<>,理解泛型设计
//String
MyArrayList<String> list = new MyArrayList<>();
list.add("JAVA");
list.add("肥皂");
list.add("go");
System.out.println(list);
list.remove("go");
System.out.println(list);
//Integer
MyArrayList<Integer> list2 = new MyArrayList<>();
list2.add(10);
list2.add(5);
list2.add(1);
System.out.println(list2);
list2.remove(10);
System.out.println(list2);
}
}
查看输出:
2.泛型方法
泛型方法的原理: 把出现泛型变量的地方全部替换成传输的真实数据类型。
public class Test {
public static void main(String[] args) {
String[] names = {"肥皂","幽灵","普莱斯"};
printArray(names);
Integer[] ages = {20,30,40};
printArray(ages);
}
//泛型方法
public static <T> void printArray(T[] arr){
if(arr !=null){
StringBuilder sb = new StringBuilder("[");
for(int i=0; i < arr.length; i++){
sb.append(arr[i]).append(i ==arr.length - 1?"":",");
}
sb.append("]");
System.out.println(sb);
}else{
System.out.println(arr);
}
}
}
查看输出:
3.泛型接口
泛型接口可以约束实现类,实现类可以在实现接口的时候传入自己操作的数据类型这样重写的方法都将是针对于该类型的操作。
//学生类
public class Student {
}
//泛型接口
public interface Data <E>{
void add(E e);
void delete(int id);
void update(E e);
E queryById(int id);
}
//实现接口并使用学生类型
public class StudentData implements Data<Student>{
@Override
public void add(Student student) {
}
@Override
public void delete(int id) {
}
@Override
public void update(Student student) {
}
@Override
public Student queryById(int id) {
return null;
}
}
泛型通配符
为什么报错?因为
提出问题:不让Dog进来该如何做
泛型上下限
在使用泛型的时候,我们可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。
由泛型上下限得出解决办法:
Java中的泛型是伪泛型的解释
泛型中类型擦除 Java泛型这个特性是从JDK 1.5加入的,为了兼容之前的版本,Java泛型的实现使用“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”(Type Erasure),将所有的泛型表示(尖括号中的内容)都替换为具体的类型(其对应的原生态类型),就像完全没有泛型一样。因此泛型只在编译阶段有效。
总结
数组不支持泛型。
泛型的类型不能为基础数据类型,比如不能用int但可以用Integer。
泛型只在编译阶段有效。
《Java 编程思想》
《Java核心技术 卷1》
《黑马程序员》