泛型
泛型就是 ArrayList**<>** list = new ArrayList**<>** () 中的类型限制
泛型的好处:
1、将运行时的问题提前至编译处;
2、泛型是JDK1.5使用的新特性;
泛型在集合中的常见应用:
ArrayList**** list = new ArrayList**** () ; // true
ArrayList**** list = new ArrayList**** () ; // false
ArrayList**** list = new ArrayList**** () ; // false
ArrayList**** list = new ArrayList () ; // true
ArrayList list = new ArrayList**** () ; // true
注意:泛型没有多态的概念,左右两边的数据类型必须要一致,或者只是写一边的泛型类型。
推荐使用:两边都写泛型。
自定义泛型
定义一个方法可以接受任意类型的参数,而且返回值类型必须要与实参的类型一致:
public class Demo{
public static void main (String[] args) {
String str = getData("abc"); // 注意不能使用基本数据类型,如果需要使用的话需要使用基本数据类型的包装类型。
}
public static <T>T getData(T o){ //T是自定义的一个变量,用来占位,表示我不知道这是个什么类型
return o
}
}
自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。
方法上自定义泛型:
修饰符 <声明自定义的泛型> 返回值类型 函数名 (使用自定义泛型…) {
}
在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就是用基本数据类型对应的包装类型。
方法泛型注意的事项:
1、在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型的。
2、自定义泛型只要符合标识符的命名规则即可。但是自定义泛型使用一般都习惯使用一个大写字母表示。T 、E
泛型类
泛型类的定义格式:
class 类名<声明自定义泛型> {
}
泛型类要注意的事项:
1、在类上自定义泛型的具体数据类型是在使用该类的时候创建对象的时候确定的。
2、如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象的时候没有指定泛型的具体数据类型,那么默认为Object类型。
3、在类上自定义的泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。
泛型接口
泛型接口的定义格式:
interface类名<声明自定义泛型> {
}
泛型接口要注意的事项:
1、接口上自定义的反省的具体数据类型是在实现一个接口的时候指定的。。
2、在接口上自定义的泛型如果在实现接口的时候没有指定的具体的数据类型,那么默认为Object类型。
需求:目前我实现一个接口的时候,我还不确定我目前要操作的数据类型,我要等待创建接口实现类对象的时候我才能指定泛型的具体数据类型。
如果要延长接口自定义泛型的具体数据类型,那么格式如下:
格式:
public class Demo implements Dao{
}
泛型的上下限
定义一个函数可以接受任意类型的集合对象,要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。
泛型中通配符:?
? super Integer:只能存储Integer或者是Integer父类元素。泛型的下限。
? extends Number:只能存储Number或者是Number类型的子类数据。泛型的上限。
public class Demo{
public static void main (String[] args) {
}
// 泛型的上限
public static void getData(Collection<? extends Number> c){
return c;
}
// 泛型的下限
public static void print(Collection<? super Integer> c){
return c;
}
}