泛型Generic
1.1简介
1. 使用场景:在定义的集合类的时候 不确定其数据类型 在实例集合的对象的时候确定其数据类型
泛型就是一个变量,变量用于来接收其数据类型
2. 使用泛型
A.在实例化集合可以确定其数据类型
B.语法: List<E> li = new Arraylist<E>();
例子: List<Student> li = new ArrayList<Student>()
C.注意点:
a.前后的泛型必须是一致的
b.在jdk1.7之后出现了菱形的泛型 后面的数据类型可以省略
例如:List<Student> li = new ArrayList<>()
c.泛型必须是引用数据类型 不能是基本数据类型
3. 泛型好处:
a.避免多次进行强制类型转换
b.将运行时的错误提前到编译期
4. 泛型使用符号
泛型使用的符号都是大写字母 所有大写字母都是可以使用
常用的符号: K V T E......
1.2 定义泛型类
1.语法:
访问修饰符 class 类名 <泛型> {
类中所有的成员都可以使用其泛型
}
2.例子:
public class MyList<T>{
}
1.3 定义泛型方法
1.语法:
访问修饰符 <T> 返回值类型 方法名称(T t) {
方法体;
return 返回值
}
2.例子:
public <T> void showInfo(T t){
}
3.说明
a.普通成员方法与静态方法都可以加上泛型
b.普通成员方法可以是类的泛型
c.静态方法不能使用类的泛型
1.4 案例
定义一个方法,可以交换任意类型的数组的某两个元素
package com.xxx;
import java.util.Arrays;
public class ChangeArray {
public static <T> T[] method(T[] arrays, int index1, int index2) {
T temp = arrays[index1];
arrays[index1] = arrays[index2];
arrays[index2] = temp;
return arrays;
}
}
class TestChangeArray {
public static void main(String[] args) {
//交换下标为1和4的元素
String[] ss = ChangeArray.method(new String[]{"a", "b", "c", "d", "e", "f"}, 1, 4);
System.out.println(Arrays.toString(ss));
}
}
1.5 定义泛型接口
1.泛型接口
a.实现类确定其泛型(数据类型)
接口:public interface Iterator<E>{
E next()
}
实现类:
public final class Scanner implements Iterator<String>{
public String next()
}
b.实现类也不确定其泛型(数据类型)
接口: public interface List<E>{
boolean add(E e)
}
实现类:
public class ArrayList<E> implements List<E>{
public boolean add(E e)
}
1.6 泛型通配符
1.泛型的通配符使用?来进行表示 ? 表示任意的数据类型 方法的通配符一般作为方法的参数使用 在实例化集合的时候
不能使用通配符
2.常用的通配符
<? extends E> E本身或者是其子类
<? super T> T本身或者是其父类类型