ArrayList<String> list=new ArrayList<String>();
表示该容器只能存储字符串类型的数据
泛型的好处:
1.将运行时的异常提前至编译时
2.避免了无谓的强制类型转换
泛型在集合中的常见应用:
ArrayList list=new ArrayList();
ArrayList list=new ArrayList();
ArrayList list=new ArrayList();
注意:
1.泛型没有多态的概念,左右两边数据类型必须一致,或者只写一边的泛型类型,推荐使用两边泛型类型
2.在泛型中,不能使用基本数据类型,如果要使用基本数据类型,那么久使用基本数据类型对应的包装类型
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
double | Double |
float | Float |
boolean | Boolean |
char | Character |
自定义泛型:一个数据类型的占位符或是一个数据类型的变量
1.方法上自定义泛型:
修饰符 <声明自定义泛型>返回值类型 函数名(使用自定义泛型…){
}
方法泛型要注意的事项:
(1).在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型
(2).自定义泛型只要符合标识符的命名规则即可,一般习惯使用一个大写字母表示(T 、E)
2.泛型类:
class 类名<声明自定义泛型>{
}
泛型类要注意的事项:
1.在类上自定义泛型的具体数据类型是在使用该类创建对象时确定的
2.如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象的时候没有指定泛型的具体数据类型,那么默认为Object类型
3.在类上自定义泛型,不能作用于静态方法,如果静态方法需要使用自定义泛型,那么需要在方法上自己声明使用
定义一个数组工具类:
class MyArray<T>{
//数组翻转
public void reserve(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) {
StringBuffer sb=new StringBuffer();
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类型
3.如果需要在创建接口实现类对象时才指定接口自定义放泛型,那么需要以下格式:
class 类名 implements 接口
泛型的上下限:
?super Integer:只能存储Integer或者Integer父类类型的数据,泛型的下限
?entends Number:只能存储Number或者Number子类类型的数据,泛型的上限