一:泛型 的好处:
1. 把运行时出现 的问题提前至了编译时。
2. 避免了无谓的强制类型转换。
什么时候使用泛型:当类中操作的引用数据类型不确定的时候,就可以使用泛型类.
在泛型中没有多态的概念,两边的数据必须要一致。 或者是只写一边 的泛型类型。建议两边的数据类型都写上一致的。
自定义泛型: 自定义泛型可以理解为是一个数据类型的占位符,或者是理解为是一个数据类型的变量。
细节一: 声明好泛型类型之后,集合中只能存放特定类型元素
public class Demo6 {
public static void main(String[] args) {
//创建一个存储字符串的list
ArrayList<String> arr=new ArrayList<String>();
arr.add("as");
arr.add("sds");
//存储非字符串编译报错.
arr.add(1);
}
}
细节二: 泛型类型必须是引用类型
public class Demo6 {
public static void main(String[] args) {
// 泛型类型必须是引用类型,也就是说集合不能存储基本数据类型
// ArrayList<int> arr2=new ArrayList<int>();
// 使用基本数据类型的包装类
ArrayList<Integer> arr2 = new ArrayList<Integer>();
}
}
细节三: 使用泛型后取出元素不需要类型转换.
public class Demo6 {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
arr.add("dsd");
arr.add("fdf");
arr.add("dsds");
//使用泛型后取出元素不需要类型转换.
String str=arr.get(0);
System.out.println();
}
}
二:泛型的分类
1. 泛型方法:
泛型方法的定义格式:
修饰符 <声明自定义泛型>返回值类型 函数名(形参列表..){
}
注意:
1. 在方法上的自定义泛型的具体数据类型是调用该方法的时候传入实参的时候确定的。
2. 自定义泛型使用的标识符只要符合标识符的命名规则即可。
demo需求: 定义一个函数可以接收任意类型的参数,要求函数的返回值类型与实参的数据类型要一致。
public class Demo2 {
public static void main(String[] args) {
Integer i= print(12); // Integer
String str = print("abc");
}
//<T> 把T字母声明为自定义 的泛型、
public static <T> T print(T o){
return o;
}
}
2 . 泛型类
泛型类的定义格式:
修饰符 class 类名<声明自定义的泛型>{
}
注意的事项:
1. 在类上自定义的泛型的具体数据类型是在创建对象的时候指定的。
2. 在类上自定义了泛型,如果创建该类的对象时没有指定泛型的具体类型,那么默认是Object类型。
public class Demo6<T> {
public static void main(String[] args) {
// 使用泛型类,创建对象的时候需要指定具体的类型
new Demo6<Integer>().getData(5);
}
public T getData(T data) {
return data;
}
// 反序任意类型数组
public void reverse(T[] arr) {
int start = 0;
int end = arr.length - 1;
for (int i = 0; i < arr.length; i++) {
if (start < end) {
T temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
}
}
在泛型类中定义一个静态方法
public class Demo6<T> {
public static void main(String[] args) {
System.out.println(getData2(100));
}
public T getData(T data) {
return data;
}
//静态方法
public static T getData2(T data) {
return data;
}
}
注意:静态方法不可以使用类中定义的泛型
因为类中的泛型需要在对象初始化时指定具体的类型,而静态优先于对象存在。那么类中的静态方法就需要单独进行泛型声明,声明泛型一定要写在static后,返回值类型之前
泛型类细节:
1、创建对象的时候要指定泛型的具体类型 2、创建对象时可以不指定泛型的具体类型(和创建集合对象一眼)。默认是Object,例如我们使用集合存储元素的时候没有使用泛型就是那么参数的类型就是Object 3、类上面声明的泛型只能应用于非静态成员函数,如果静态函数需要使用泛型,那么 需要在函数上独立声明。 4、如果建立对象后指定了泛型的具体类型,那么该对象操作方法时,这些方法只能操作一种数据类型。 5、所以既可以在类上的泛型声明,也可以在同时在该类的方法中声明泛型。 |
3 . 泛型接口:
泛型接口的定义格式:
interface 接口名<声明自定义的泛型>{
}
在接口上自定义泛型要注意的事项:
1. 在接口上自定义泛型的具体数据类型是在实现该接口的时候指定的。
2. 如果一个接口自定义了泛型,在实现该接口的时候没有指定具体的数据类型,那么默认是Object数据类型。
interface Inter<T> {
void print(T t);
}
// 实现不知为何类型时可以这样定义
class MyInter<T> implements Inter<T> {
public void print(T t) {
System.out.println("myprint:" + t);
}
}
//使用接口时明确具体类型。
class MyInter2 implements Inter<String> {
@Override
public void print(String t) {
System.out.println("myprint:" + t);
}
}