JavaSE——泛型自定义泛型泛型通配符上下限
Posted javaHane
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE——泛型自定义泛型泛型通配符上下限相关的知识,希望对你有一定的参考价值。
泛型
泛型概述
-
泛型的介绍
泛型是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("开始比赛");
以上是关于JavaSE——泛型自定义泛型泛型通配符上下限的主要内容,如果未能解决你的问题,请参考以下文章
Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
Java 泛型泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )