浅析理论:
一、概述 1、编写代码更加方便 2、增加安全性 二、声明 1、在类上声明 类名<泛型> 如果多个,是用逗号隔开 在整个类中都可以使用,除了静态方法 2、在方法上声明 <泛型> 返回值类型 如果多个,使用逗号隔开 在方法上的泛型仅在方法中有效 方法的返回值,方法参数,方法一次都可以使用泛型 3、范围约束 <T extends B> 窄化(用于声明) 三、赋值 1、在类型上赋值 在定义引用时 2、方法上泛型赋值 在方法调用时 显示的 调用时卸载方法名前面 隐式的 比如用什么类型的变量接收方法返回值,则返回值的泛型就是什么 四、泛型的使用 1、不给泛型赋值,则默认是Object,如果是窄化的,则默认是extents后面的 2、<?> 任意类型 <? super Number> 限定范围 (注:此时是赋值) 3、泛型信息不会保留到运行时
基础案例:
package com.gongxy.genericity; import com.sun.org.apache.xml.internal.serializer.ToSAXHandler; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author gongyg * @date 2020/8/25 10:04 * @description 泛型类 <泛型单词Genericity> */ public class GenericityDemoDo<T> { private T data; public void setData(T data){ this.data = data; } public T getData(){ return this.data; } /* 静态方法不可以使用传入的泛型类参数 public static T getData(){ return this.data; } */ /** * 泛型方法 */ public static <K> K compareInteger(K k1, K k2){ return ((Integer)k1 > (Integer)k2) ? k1 : k2; } @Override public String toString() { return "data:" + this.data; } public static void main(String[] args) { GenericityDemoDo<String> demoDo = new GenericityDemoDo<>(); demoDo.setData("gongxy"); System.out.println(demoDo.getData()); System.out.println(GenericityDemoDo.<Integer>compareInteger(1, 2)); } } /** * 定义的是一个类,而不是一个对象 * 范围约束 */ class GenericityDemo2Do<T extends GenericityDemoDo<String>>{ public <K> T print(K k1){ GenericityDemoDo<String> demoDo = new GenericityDemoDo<>(); demoDo.setData((String)k1); return (T)demoDo; } public static void main(String[] args) { GenericityDemo2Do<GenericityDemoDo<String>> demo2Do = new GenericityDemo2Do<>(); String value = demo2Do.<String>print("123").getData(); System.out.println(value); } } class GenericityDemo3Test{ public static void main(String[] args) { List<? super Collection> list = new ArrayList<>(); list.add(new ArrayList()); } }