@TOC
1.什么是泛型
(1)什么是泛型类
(2)泛型类的定义
public class 类名 <泛型类型,...> {
private 泛型类型 变量名
public 泛型类型 方法名(){ }
public 返回值 方法名(泛型类型 t){ }
....
}
类名<具体数据类型> 对象名 = new 类名< >();
(3)案例实战(T是外部使用的时候来指定的类型)
package com.lixiang;
public class GenericTest<T> {
private Object[] arr;
private int num;
public GenericTest(int size){
arr = new Object[size];
num = 0;
}
public T get(int index){
if(index>=arr.length){
return null;
}
return (T) arr[index];
}
public void put(T data){
if(num>arr.length){
return;
}
arr[num++] = data;
}
public static void main(String[] args) {
GenericTest<String> genericTest = new GenericTest<>(5);
genericTest.put("lixiang");
genericTest.put("lixiang");
System.out.println(genericTest.get(0));
}
}
(4)泛型接口
interface 接口名称 <泛型类型1,...> {
泛型类型 方法名();
....
}
(1)什么是泛型方法
修饰符 <T,E,...> 返回值类型 方法名( 参数列表 ){
方法体
....
}
(2)声明泛型方法
public static <E> E getRandomElement(List<E> list){
Random random = new Random();
return list.get(random.nextInt(list.size()));
}
//测试
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李祥");
list.add("王武");
String randomElement = getRandomElement(list);
System.out.println(randomElement);
}
(3)可变参数的泛型方法
public static <T> void print(T...arr){
for(T t:arr){
System.out.println(t);
}
}
//测试
public static void main(String[] args) {
print("李祥","张三","李四");
}
(1)什么是泛型通配符
//表示类型参数可以是任何类型
public class CustomCollection<?>{}
//表示类型参数必须是A或者是A的子类
public class CustomCollection<T extends A>{}
//表示类型参数必须是A或者是A的超类型
public class CustomCollection<T supers A>{}
(2)泛型通配符案例实战
//使用泛型通配符,复用性更强
public static void print(NumberCollection<?> collection){
Object collectionValue = collection.getValue();
System.out.println(collectionValue);
}
public class NumberCollection<T> {
private T value;
public NumberCollection(T value){
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
//使用泛型通配符,复用性更强
public static void print(NumberCollection<?> collection){
Object collectionValue = collection.getValue();
System.out.println(collectionValue);
}
public static void main(String[] args) {
NumberCollection<Integer> integerNumberCollection = new NumberCollection<>(1);
NumberCollection<Long> longNumberCollection = new NumberCollection<>(23L);
//通用性更强
print(integerNumberCollection);
print(longNumberCollection);
}
}
(3)泛型上边界通配符
//使用泛型通配符, 固定上边界的通配符,不能任意元素,只能是Number的子类
public static void printUp(NumberCollection<? extends Number> collection){
Number collectionValue = collection.getValue();
System.out.println(collectionValue);
}
//字符串类型,测试报错
NumberCollection<String> stringNumberCollection = new NumberCollection<>("springboot");
printUp(stringNumberCollection);
(4)泛型下边界通配符
//只是是integer或者integer的父类
public static void printDown(NumberCollection<? super Integer> collection){
Object object = collection.getValue();
System.out.println(object);
}
//测试
NumberCollection<Long> longNumberCollection = new NumberCollection<>(23L);
//报错,类型不支持,需要ineter或其父类
// printDown(longNumberCollection);
NumberCollection<Integer> integerNumberCollection = new NumberCollection<>(1);
printDown(integerNumberCollection);
NumberCollection<Number> numberCollection = new NumberCollection<>(55L);
printDown(numberCollection);
(1)什么是泛型类型擦除
(2)无类型限制泛型擦除测试
//没指定类型则擦除后是Object最顶级父类
public class Generic <T,K> {
private T age;
private K name;
public static void main(String[] args) {
Generic generic = new Generic<Integer,String>();
//反射获取字节码文件class对象
Class<? extends Generic> aClass = generic.getClass();
//获取所有成员变量
Field[] declaredFields = aClass.getDeclaredFields();
for(Field field : declaredFields){
//获取每个属性名称和类型
System.out.println(field.getName() +",类型="+field.getType().getSimpleName());
}
}
}
(3)有类型限制泛型参数测试
//T 需要是 Number的子类,所以擦除后就是Number类型,没指定类型则擦除后是Object最顶级父类
public class Generic <T extends Number,K> {
private T age;
private K name;
public static void main(String[] args) {
Generic generic = new Generic<Integer,String>();
//反射获取字节码文件class对象
Class<? extends Generic> aClass = generic.getClass();
//获取所有成员变量
Field[] declaredFields = aClass.getDeclaredFields();
for(Field field : declaredFields){
//获取每个属性名称和类型
System.out.println(field.getName() +",类型="+field.getType().getSimpleName());
}
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。