泛型是jdk1.5使用的新特性
好处:
1.将运行时的异常提前到了编译时。
2.避免了无谓的强制类型转换.
注意事项:
1.泛型没有多态的概念,左右两边的数据类型必须一致,或者只是写一边的泛型类型.
2.泛型不能使用基本类型;
需求:定一个方法可以接收任意类型的数据,而且返回值类型必须要与实参的类型一致。
自定义泛型:就是一个数据类型的占位符或者是一个数据类型的变量.
注意事项:1.在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型。
2.自定义泛型只要符合标识符的命名规则即可,但是自定义泛型一般都习惯使用一个大写字母.
方法上自定义泛型:
public static void main(String[] args){
String str=getData("abc");
Integer i=getData(123);
}
public static <T>T getData(T o){
retrun 0;
}
泛型类:
class 类名<声明自定义泛型>{}
注意事项:1.在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时决定的
2.如果一个类在类上已经声明了自定义泛型,如果是该类创建对象的时候没有指定泛型,那么泛型的具体数据类型就是Object类型
3.在类上定义的泛型不能作用与静态的方法,如果静态的方法需要自定义泛型,需要在方法上自己声明使用
public static void main(String[] args) {
Integer[] it={10,9,44,2,3,7,1};
String[] str={"A","B"," ","c"};
MyArrays<Integer> arrTool=new MyArrays<Integer>();
arrTool.reverse(it);
//arrTool.reverse(str);
System.out.println(arrTool.toString(it));
//System.out.println(arrTool.toString(str));
}
class MyArrays<T>{
public void reverse(T[] arr){
for(int startIndex=0,endIndex=arr.length- 1;startIndex<endIndex;startIndex++,endIndex--){
T temp=arr[startIndex];
arr[startIndex]=arr[endIndex];
arr[endIndex]=temp;
}
}
public String toString(T[] arr){
StringBuilder sb=new StringBuilder();
for(int i=0;i<arr.length;i++){
if(i==0){
sb.append("{"+arr[i]);
}else if(i==arr.length-1){
sb.append(","+arr[i]+"}");
}else{
sb.append(","+arr[i]);
}
}
return sb.toString();
}
}
泛型接口: interface 接口名<声明的自定义泛型>{}
注意事项:1.接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。
2.接口上自定义的泛型如果实现一个接口的时候没有指定数据类型,默认Object
public class GenericityInterface implements Dao<String> {
public void add(String t) {
}
}
interface Dao<T>{
public void add(T t);
}
需求:目前实现一个接口的时候,还不明确要操作的数据类型,要等到创建接口实现类对象的时候才能确定数据类型
如要延长接口自定义的具体数据类型,格式:
public class Demo<T> implements Dao<T>{}
泛型的上下限:
需求:定义一个函数可以接收任意类型的集合对象,要求接收的集合对象只能存储Integer或者Integer的父类类型数据.
泛型通配符:?
泛型的下限: ? super Integer:只能存储integer或者是其父类元素
泛型的上限: ? extends Number:只能存储Number或者其子类元素。
public static void main(String[] args) {
ArrayList<Integer> list1=new ArrayList<Integer>();
ArrayList<Number> list2=new ArrayList<Number>();
HashSet<String> set=new HashSet<String>();
print(list1);
//print(set); 错误
}
public static void print(Collection<? super Integer> c){
}