1、泛型
(1)泛型的好处:
1、把原来程序运行时可能发生的问题,转变为编译时的问题。
2、提高程序的安全型。
(2)泛型的擦除机制
让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的
的Java程序后,生成的class文件中将不再带有泛型信息。简单的说:泛型只在编译阶段有效
运行阶段无效。
(3) 泛型的应用
1、在类上声明泛型
class 类名<T> {}
类上声明的泛型可以应用在什么位置?
泛型可以应用于实例属性、和实例方法上。
类的成员:成员属性 成员方法
成员属性:实例属性 类属性
成员方法:实例方法 类方法
类上声明的泛型为什么不能应用在类属性,类方法上呢,因为类属性,类方法可以直接通过类名调用,这时泛型还没有具体类型。类名.属性 类名.方法。
泛型如果应用在方法上可以应用于参数和返回值上。
public class Genec<T>{
T t;
public T fun( T t1){
}
}
2、在方法上声明泛型
声明泛型与使用泛型的区别?
声明泛型:<>当括号
应用泛型:不带括号
怎样在方法上声明泛型?
》泛型必须声明在返回值之前。
public <T> void fun1(T t2){
}
在方法上声明泛型,怎样使用?
方法上的泛型只能在方法上使用。可以在方法的参数上以及返回值上
//在这个方法上声明泛型
public static <T> T show(T t){
T m;
return null;
}
3、泛型的通配符为?
主要有两个应用:
(1) ? extends E
在Collection接口中声明
boolean addAll(Collection<? extends E>);
本类以及所有子类型
public void fun1(){
List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Double> list2 = new ArrayList<Double>();
list2.add(1.0);
list2.add(2.0);
list2.add(3.0);
List<String> list3 = new ArrayList<String>();
list3.add("a");
list3.add("b");
list3.add("c");
List<Object> list = new ArrayList<Object>();
list.addAll(list1); //addAll(Collection<? extends E> c)
list.addAll(list2);
list.addAll(list3);
System.out.println(list);
}
(2) ? super E
本类以及父类.
TreeSet(Comparator<? super E> comparator)
TreeSet集合中的元素要求必须有自然顺序(Comparable接口) 如果没有自然顺序,就需要人为指定比较器(Comparator接口)
2、枚举