一、泛型概述
泛型的本质是参数化类型,也就是说所操作的 数据类型被指定为一个参数类型。
二、泛型类
定义泛型类在"类名"后添加一对<>,里面定义"泛型名称";
格式:如ArrayList集合
示例:
class ArrayList<E> {
public boolean add(E e) { }
public E get(int index) { }
}
使用泛型类:创建对象时,确定泛型的类型
例如:ArrayList<String> list = new ArrayList<String>(); 此时相当于将E的类型替换为String类型。
三、集合中使用泛型
使用泛型,规定集合元素类型必须为某种类型
示例:
List<String> list=new ArrayList<>();
list.add("yyy");
list.add("wtc");
for(int i=0;i<list.size();i++){
String s=(String)list.get(i);
System.out.println("获取的值为:"+s);
}
//aslist:将多个数据转成集合
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<String> list2 = Arrays.asList("y", "w", "a");
四、泛型方法
定义格式:修饰符 <表示泛型方法> 返回值类型 方法名(泛型标示符 参数名称){}
示例:
mport java.util.ArrayList;
import java.util.List;
public class demo_泛型方法 {
public static void main(String[] args) {
//任何同类型的数据类型都可以,不在局限于只能传一种类型的数据
List list=ArrayTools.toList("w","y");
System.out.println(list);
List list1=ArrayTools.toList(1,2,3);
System.out.println(list1);
}
}
class ArrayTools{
//...表示参数个数任意即可变参数
public static <T> List toList(T...e){
List<T> list=new ArrayList<>();
for(int i=0;i<e.length;i++){
list.add(e[i]);
}
return list;
}
}
运行结果:
五、泛型接口
格式:权限修饰符 interface 接口名<泛型标示符>{}
示例:
public class demo_泛型接口 {
public static void main(String[] args) {
Inter<String> inter=new InterImpl();
}
}
interface Inter<T>{
T getData(T t);
}
class InterImpl<T> implements Inter<T>{
@Override
public T getData(T s) {
return null;
}
}
六、泛型通配符
类型通配符一般是使用?代替具体的类型参数。
例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的类。
示例:
import java.util.ArrayList;
import java.util.List;
public class demo_泛型通配符 {
public static void main(String[] args) {
List<String> strings=new ArrayList<>();
m1(strings);
List<Person> people=new ArrayList<>();
List<Student> students=new ArrayList<>();
List<Teacher> teachers=new ArrayList<>();
m2(people);
m2(students);
m3(people);
//m3(teachers);报错
}
//任何类型的参数都可以
public static void m1(List<?> list){}
//list的类型只能是Person以及Person的子类
public static void m2(List<?extends Person> list){}
//只能是Student类型或者是Student的父类类型
public static void m3(List<?super Student> list){}
}
class Person{}
class Student extends Person{}
class Teacher extends Person{}
七、使用泛型的好处
可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
- 类型安全
- 消除强制类型转换