泛型是我們編程中經(jīng)常使用到的镣陕,比如指定List集合類型或者M(jìn)ap的時(shí)候谴餐,或者比如定義public <T> void write(T t, T[] ta);
方法的時(shí)候,我們用一個T
就定義了呆抑,那么岂嗓,什么是泛型呢?
泛型就是指所操作的數(shù)據(jù)類型被指定為一個參數(shù)鹊碍,這種參數(shù)類型可是是任意類型厌殉,可以用在類、接口和方法的創(chuàng)建中侈咕,分別稱為泛型類公罕、泛型接口、泛型方法。
在Java SE 1.5之前(沒有泛型的情況下),如果要引用任意對象撞叨,必須通過對類型Object的引用來實(shí)現(xiàn)參數(shù)的“任意化”腾夯,“任意化”帶來的缺點(diǎn)是要做顯式的強(qiáng)制類型轉(zhuǎn)換训貌,而這種轉(zhuǎn)換是要求開發(fā)者必須知道實(shí)際參數(shù)類型的情況下方可進(jìn)行。
package com.weixin.web;
public class Box<T> {
private T object;
public void set(T object) {
this.object = object;
}
public T get() {
return object;
}
public static void main(String[] args) {
Box<Apple> box = new Box<Apple>();
box.set(new Apple());
Apple apple = box.get();
Box box2 = new Box(); //非泛型 需強(qiáng)制轉(zhuǎn)換
box2.set(new Apple());
Apple apple2 = (Apple) box2.get();
}
}
對于強(qiáng)制類型轉(zhuǎn)換錯誤,編譯器有可能不提示,而是在運(yùn)行的時(shí)候才出現(xiàn)異常张吉,泛型的好處是在編譯的時(shí)候檢查類型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動和隱式的催植,以提高代碼的重用率肮蛹。
但是我們在定義泛型類,泛型方法创南,泛型接口的時(shí)候伦忠,經(jīng)常會碰見除了T
以外的通配符,比如E
扰藕,K
缓苛,V
甚至?
等等,這些通配符是什么意思呢邓深?
未桥? 表示不確定的java類型
T (type) 表示具體的一個java類型
K V (key value) 分別代表java鍵值中的Key Value
E (element) 代表Element