1.什么是泛型?
泛型就是未定义的类型,其实泛型编译之后就是不存在的了。
2.泛型类模板
1)广泛通用的类型.泛型类只适用于非静态方法。
2)代码模板中类型不确定,谁调用该段代码,谁指明类型是什么。
3)泛型不存在继承的关系(错误如). List<Object> list = new ArrayList<String>();//错误的。
public class GeneriTypeDemo {
public static void main(String[] args) {
GeneriType<String> type1 = new GeneriType<>();
type1.setX("这里只能设置String类型");
String str1 = type1.getX();
System.out.println(str1);
GeneriType<Integer> type2 = new GeneriType<>();
type2.setX(new Integer(2));
Integer num = type2.getX();
System.out.println(num);
}
}
class GeneriType<T> {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
3.泛型方法:在方法上声明泛型
1)泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法。
2)泛型类中的泛型应该适用于整个类中多个方法,有时候只对某一个方法设置泛型即可。
3)一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的。
public class GeneriTypeStaticDemo {
public static void main(String[] args) {
String str = doWork("1");
Integer num = doWork(123);
}
public static <T> T doWork(T args) {
T val = args;
return val;
}
}
4.泛型的上限和下限
1)泛型的上限和下限:用来限定元素的类型必须是X类的子类或相同,X的父类或相同.
2)?表示通配符
import java.util.ArrayList;
import java.util.List;
public class GeneriTypeLimit {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
doWork1(list1);
List<Number> list2 = new ArrayList<>();
doWork2(list2);
}
public static void doWork1(List<? extends Number> val) {
}
public static void doWork2(List<? super Number> val) {
}
}