java 之 泛型
阿新 • • 發佈:2020-08-25
簡潔理論:
一、概述 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()); } }