Java 泛型和萬用字元
阿新 • • 發佈:2018-11-20
Java 泛型和萬用字元
很多時候,反射並不能滿足業務的需求,Java 泛型和萬用字元與反射配合使用可使得反射的作用發揮到完美的地步,從而實現真正的通用。
直接上程式碼
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 萬用字元基於泛型,用來修飾泛型
* 萬用字元和泛型都是用來宣告型別的
*/
public class GenericityClass<T> {
public static void main(String[] args) {
System.out.println(test(new Pojo<Integer>()));
new GenericityClass<Comparable<?>>().test4(new ArrayList<Integer>());
new GenericityClass<Integer>().test5(new ArrayList<Comparable< ?>>());
List<?>[] l = new GenericityClass<Integer>().test6(1);
System.out.println(l[0].get(0));
System.out.println(l[1].get(0));
}
/**
* 泛型
*/
public static <T extends Comparable<? super Integer> & Serializable> T test(T t) {
return t;
}
/**
* 萬用字元
*/
public Integer test2(Pojo<? extends Comparable<Integer>> t) {
return 1;
}
/**
* 萬用字元
*/
public Integer test3(Pojo<? super Serializable> t) {
return 1;
}
/**
* 萬用字元 extends 和 super
*/
public void test4(List<? extends T> set) {}
public void test5(List<? super Integer> set) {}
/**
* 萬用字元陣列
*/
public List<?>[] test6(T t) {
List<?>[] arr = new ArrayList<?>[2];
List<Integer> l1 = new ArrayList<Integer>();
l1.add(1);
List<Object> l2 = new ArrayList<Object>();
l2.add(new Object());
arr[0] = l1;
arr[1] = l2;
return arr;
}
}
實體類程式碼
class Pojo<T> implements Comparable<Integer>, Serializable{
private static final long serialVersionUID = 1L;
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public int compareTo(Integer o) {
return 0;
}
}
泛型擦除
在很多書籍中能見到泛型擦除這幾個字眼兒,但是在Java7以後,泛型擦除引發的各種問題基本已被解決。
程式碼:
/**
* 泛型擦除:如List<T> 在javac編譯後T將被擦除掉,並在相應的地方插入強制轉換型別程式碼
*/
class Example {
public static void main(String[] args) {
test1();
test2();
}
/**
* 泛型擦除前示例
*/
public static void test1() {
Map<String, String> map = new HashMap<String, String>();
map.put("hello", "你好");
map.put("how are you?", "吃了沒?");
System.out.println(map.get("hello"));
System.out.println(map.get("how are you?"));
}
/**
* 泛型擦除後示例
*/
public static void test2() {
Map map = new HashMap();
map.put("hello", "你好");
map.put("how are you?", "吃了沒?");
System.out.println((String) map.get("hello"));
System.out.println((String) map.get("how are you?"));
}
}
輸出的結果並沒有差異