泛型主要讲解以下四点:
一.泛型类的使用(太简单了,忽略跳过。。。)
二.自定义泛型类、泛型接口、泛型方法的使用
三.泛型与继承的关系
四.通配符
第二:自定义泛型类、泛型接口、泛型方法的使用
1.自定义泛型类
1.1:当实例化泛型类的对象时,指明泛型的类型,指明以后,在对应的类中所有使用泛型的位置的类型,都变为实例化中指定的泛型的类型
1.2:如果我们自定义了泛型类型,但是在实例化中没有使用,那么默认泛型的类型是Object类型
2.泛型接口:
2.1:如果现有的接口继承泛型类接口时,指明了泛型的类型,那么此接口在使用父类所有指明泛型类型的位置时,都是此类型。
2.2:类与接口一直
2.3:如果在声明类或者接口的时候,仍然不知道该使用那种类型,那么,还是可以使用<T>或者<E>来待定类型
3.泛型方法的使用
泛型方法是在泛型类的内部定义的方法,方法的泛型类型跟类的泛型类型不是一个类型,要求调用此方法的时候,传入什么类型方法就返回什么类型,而返回的类型和类的泛型类型不是一个类型
Order<Boolean> order = new Order();
order.setT(true);
System.out.println(order.getT());
// 泛型方法
Integer[] in = new Integer[]{1,2,6,90};
List<Integer> li = new ArrayList<Integer>();
List<Integer> list2 = order.format(in, li);
System.out.println(list2);
以上代码表明:Order类的泛型类型为Boolean,但是类里面的泛型方法的参数类型可以是Integer类型的,也就是说泛型方法传入的泛型类型可以和当前类规定的泛型类型不一致,下面我们来看泛型方法是如何编写的。。。
public class Order<T> {
List<T> list = new ArrayList();
//类的泛型方法是T,而方法的泛型类型是E,表明不一个类型
// 泛型方法的使用
/**
* 实现数组到集合的复制
* @param e
* @param list
* @return list
*/
public <E> List<E> format(E[] e, List<E> list) {
for (E e1 : e) {
list.add(e1);
}
return list;
}
第三:泛型与继承的关系如果 A 是 B 的子类,那么List<A>不是List<B>的子接口。
/**
* 3.泛型与继承的关系
* 如果 A 是 B 的子类,那么List<A>不是List<B>的子接口
*/
// 可行(String是Object的子类,子类可以直接赋值给父类)
Object obj = null;
String str = "AA";
obj = str;
// 也可行(String是Object的子类,数组子类可以直接赋值给数组父类)
Object[] object = null;
String[] string = new String[]{"哈喽","你好"};
object = string;
// 不可行
List<Object> list = null;
List<String> list1 = new ArrayList<String>();
list = list1; // 此处会报错,类型不匹配,他们是并列关系
第四:通配符 ?4.1:List<A>、List<B>、·····都是List<?>的子类
4.2:? extends A:可以存放A及其子类
4.3:? super A:可以存放A及其父类
// 可行
List<? extends Number> list = new ArrayList<Number>();//类是于小于等于Number类型
List<Integer> list1 = new ArrayList<Integer>();
list = list1;
// 可行
List<? super Number> list2 = new ArrayList<Number>(); //类是于大于等于Number类型
List<Object> list3 = new ArrayList<Object>();
list2 = list3;
// 不可行
list = list3; // 此处会报错,类型不匹配