目錄
簡介:
Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。
泛型的本質是參數化類型,也就是說所操作的數據類型被指定爲一個參數。
實際業務開發中,泛型多被用來定義泛型函數,用於處理對不同類實例對象的相同操作以簡化代碼。
泛型接口:
package com.knowledge.system.java_system.generices_system.generices_instance;
public interface Generator<T> {
public T testGenerices();
}
package com.knowledge.system.java_system.generices_system.generices_instance;
import java.util.Random;
public class GeneratorImpl implements Generator<Integer> {
int num[]={1,2,3,4,5,6,7};
@Override
public Integer testGenerices() {
Random random=new Random();
return num[random.nextInt(7)];
}
}
package com.knowledge.system.java_system.generices_system.generices_instance;
import lombok.Data;
@Data
public class Man {
private String name;
private Integer age;
private Integer sex;
}
package com.knowledge.system.java_system.generices_system.generices_instance;
import java.util.Map;
public class GeneratorImpl2 implements Generator<Man> {
@Override
public Man testGenerices() {
Man man=new Man();
man.setAge(12);
man.setName("tset");
man.setSex(12);
return man;
}
}
package com.knowledge.system.java_system.generices_system.generices_instance;
import com.alibaba.fastjson.JSON;
public class Test {
public static void main(String[] args) {
GeneratorImpl im=new GeneratorImpl();
GeneratorImpl2 im2=new GeneratorImpl2();
System.out.println(im.testGenerices());
System.out.println(JSON.toJSONString(im2.testGenerices()));
}
}
泛型類:
package com.knowledge.system.java_system.generices_system.generice_class;
public class GenericeClass<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
package com.knowledge.system.java_system.generices_system.generice_class;
public class Test {
public static void main(String[] args) {
GenericeClass gc=new GenericeClass();
gc.setT(12);
System.out.println(gc.getT());
}
}
泛型方法:
package com.knowledge.system.java_system.generices_system.generices_function;
import java.util.List;
/**
* 1.類型參數聲明部分(由尖括號分隔),該部分在方法返回類型之前.
* 2.每一個類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開。
* 3.類型參數能被用來聲明返回值類型,並且能作爲泛型方法的實際參數類型的佔位符。
* 4.泛型方法體的聲明和其他方法一樣。注意類型參數只能代表引用型類型,不能是原始類型(像int,double,char的等)。
* 5.<T extends Number> 指定泛型參數的上界,及T爲Number類型或其子類型
*/
public class GenericesFunction {
public static void main(String[] args) {
Number num=getNum(1,2,3);
System.out.println(num);
}
private static <T extends Number,E extends Integer> Number getNum(T i, T i1, E i2) {
return i1.intValue()+i2.intValue()+i.intValue();
}
}
有界參數:
package com.knowledge.system.java_system.generices_system.generices_function;
import java.util.List;
/**
* 1.類型參數聲明部分(由尖括號分隔),該部分在方法返回類型之前.
* 2.每一個類型參數聲明部分包含一個或多個類型參數,參數間用逗號隔開。
* 3.類型參數能被用來聲明返回值類型,並且能作爲泛型方法的實際參數類型的佔位符。
* 4.泛型方法體的聲明和其他方法一樣。注意類型參數只能代表引用型類型,不能是原始類型(像int,double,char的等)。
* 5.<T extends Number> 指定泛型參數的上界,及T爲Number類型或其子類型
*/
public class GenericesFunction {
public static void main(String[] args) {
Number num=getNum(1,2,3);
System.out.println(num);
}
private static <T extends Number,E extends Integer> Number getNum(T i, T i1, E i2) {
return i1.intValue()+i2.intValue()+i.intValue();
}
}
類型通配符:
<? extends T>表示該通配符所代表的類型是T類型的子類。
<? super T>表示該通配符所代表的類型是T類型的父類。
對於泛型,只是允許程序員在編譯時檢測到非法的類型而已。通過反射依舊可以添加想要的數據類型。
package com.knowledge.system.java_system.generices_system.generices_tongpeifu;
import java.util.ArrayList;
import java.util.List;
public class GenericeTongPeiFu {
public static void main(String[] args) {
try {
List <Integer> integerList=new ArrayList<>();
integerList.add(12);
integerList.add(223);
List<String>stringlist=new ArrayList <>();
stringlist.add("123123");
stringlist.add("ajkfhah");
stringlist.add("afjasasghashddhs");
printList(integerList);
printListBYFX(integerList,Integer.class);
printListBYFX(stringlist,String.class);
printListByTPF(integerList);
printListByTPF(stringlist);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
//只能處理一種類型的參數
private static void printList(List <Integer> integerList) {
for(Integer integer:integerList){
System.out.println(integer);
}
}
//泛型函數,能夠處理多種類型的額參數,可動態添加參數,改變集合數據
private static <T> void printListBYFX(List<T> list,Class<T> clz) throws IllegalAccessException, InstantiationException {
T t1= null;
try {
if(clz==Integer.class){
t1 = (T)clz.getConstructor(int.class).newInstance(145);
}
if(clz==String.class){
t1 = (T)clz.getConstructor(String.class).newInstance("ahgahg");
}
} catch (Exception e) {
e.printStackTrace();
}
list.add(t1);
for(T t:list){
System.out.println(t);
}
}
//使用類型通配符,能夠處理多種類型的額參數,可動態添加參數,改變集合數據
private static void printListByTPF(List<?> list){
//list 無法添加元素,這也是通配符和泛型參數的區別
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}