泛型
泛型概述
-
泛型的介绍
泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制
-
泛型的好处
-
-
避免了强制类型转换
-
-
泛型的定义格式
-
<类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如: <E> <T>
-
<类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如: <E,T> <K,V>
泛型类
package com.zhao.genericity_class;
import java.util.ArrayList;
public class MyArrayList<E> {
private ArrayList arrayList=new ArrayList();
public void add(E e){
arrayList.add(e);
}
public void remove(E e){
arrayList.remove(e);
}
@Override
public String toString() {
return arrayList.toString();
}
}
package com.zhao.genericity_class;
public class Test {
//需求:模拟ArrayList定义一个MyArrayList,但只需要关注泛型设计增加删除操作
public static void main(String[] args) {
MyArrayList<String> list=new MyArrayList<>();
list.add("aaa");
list.add("张三");
list.add("MySQL");
//list.add(123);报错,约定好了泛型类
System.out.println(list);
list.remove("MySQL");
System.out.println(list);
MyArrayList<Integer> list2=new MyArrayList<>();
list2.add(111);
list2.add(222);
list2.add(333);
//list2.add("张三");报错,约定好了泛型类
System.out.println(list2);
list2.remove(333);
System.out.println(list2);
}
}
泛型方法
package com.zhao.genericity_method;
public class GenericityDemo {
public static void main(String[] args) {
String[] names={"张三","李四","王五"};
//调用泛型打印方法
printArray(names);
Integer[] ages={18,20,25};
printArray(ages);
}
//用泛型方法用于接任意类型的元素写一个打印数组内容的方法
public static <T> void printArray(T[] arr){
if (arr!=null){
StringBuilder sb=new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
//用三元运算符连续拼接除了最后一个元素之间的逗号
sb.append(arr[i]).append(arr.length-1==i?"":",");
}
sb.append("]");
System.out.println(sb);
}else {
//如果数组内存的是null那就直接输出
System.out.println(arr);
}
}
}
泛型接口
重点在于写法,省略了对象类的内容
package com.zhao.genericity_interface;
public class Student {
}
package com.zhao.genericity_interface;
public class Teacher {
}
package com.zhao.genericity_interface;
public interface Data<E> {
void add(E e);
void delete(int id);
void update(E e);
void queryById(int id);
}
package com.zhao.genericity_interface;
public class StudentData implements Data<Student>{
@Override
public void add(Student student) {
}
@Override
public void delete(int id) {
}
@Override
public void update(Student student) {
}
@Override
public void queryById(int id) {
}
}
package com.zhao.genericity_interface;
public class TeacherData implements Data<Teacher>{
@Override
public void add(Teacher teacher) {
}
@Override
public void delete(int id) {
}
@Override
public void update(Teacher teacher) {
}
@Override
public void queryById(int id) {
}
}
泛型通配符<?>与其上下限
package com.zhao.genericity_limit;
public class Car {
}
package com.zhao.genericity_limit;
public class BENZ extends Car{
}
package com.zhao.genericity_limit;
public class BMW extends Car{
}
package com.zhao.genericity_limit;
import com.zhao.genericity_interface.Data;
import java.util.ArrayList;
public class GenericDemo {
public static void main(String[] args) {
ArrayList<BENZ> list1=new ArrayList<>();
list1.add(new BENZ());
list1.add(new BENZ());
list1.add(new BENZ());
go(list1);
ArrayList<BMW> list2=new ArrayList<>();
list2.add(new BMW());
list2.add(new BMW());
list2.add(new BMW());
go(list2);
/*ArrayList<Dog> list3=new ArrayList<>();
list3.add(new Dog());
list3.add(new Dog());
list3.add(new Dog());
go(list3);*/
//如果直接用泛型通配符<?>的话会将Dog也传进汽车队伍里
}
//所有车比赛
/*
ArrayList<Car>虽然是ArrayList<BMW>和ArrayList<BENZ>的父类,但是它们是三个完全独立的集合
public static void go(ArrayList<Car> cars){
System.out.println("开始比赛");
}*/
/*public static void go(ArrayList<?> cars){
System.out.println("开始比赛");
}*/
/*
泛型的上下限:
?extends Car 必须是Car或其子类 泛型上限
?super Car 必须是Car或其父类 泛型下限
*/
public static void go(ArrayList<?extends Car> cars){
System.out.println("开始比赛");
}
}