泛型(Generic Type),也就是通用的类型.
代码的母版,提供了代码复用的功能.说白了就是想定义一个你不清楚的类型的数据.
- 泛型类,直接在类上定义泛型
public class Box<K,V>
{
private K k;
private V v;
Box(K k,V v)
{
this.k=k;
this.v=v;
}
public K getK() {
return k;
}
public void setK(K k) {
this.k = k;
}
public V getV() {
return v;
}
public void setV(V v) {
this.v = v;
}
}
public class Main {
public static void main(String[] args) {
Box<String,Integer> b= new Box<>("a",1);
//泛型没有继承关系,故下面的语句会报错
//Box<Object,String> c = new Box<String,String>("a","b");
}
}
2.泛型方法
声明一个泛型方法很简单,只要在返回类型前面加上一个类似<K,V>的形式就行了
public static <K, V> boolean compare(Box<K, V> p1, Box<K, V> p2) {
return p1.getK().equals(p2.getK()) &&
p1.getV().equals(p2.getV());
}
一般当参数使用到泛型时才有价值.
3.通配符的使用,接收数据
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
doWork(list1);
List<String> list2 = new ArrayList<>();
doWork(list2);
}
private static void doWork(List<?> list){
}
}
可以看到,当方法doWork()调用之前不知道需要什么样的数据类型,就可以使用通配符?
4.泛型的上下限
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
doWork1(list1);
List<String> list2 = new ArrayList<>();
doWork2(list2);
}
//上限 ?必须是Number 的子类或Number
private static void doWork1(List<? extends Number> list){
}
//下限 ?必须是String 的父类或者String
private static void doWork2(List<? super String> list){
}
}
5.泛型的擦除
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(1);
List list2 = null;
list2 = list1;//此时list1的泛型被擦除
list2.add("abc");
list2.add(111);
System.out.println(list2);
}
}
这里擦除只是简单的介绍一下,下面的这个链接写的非常的详细