術(shù)語(yǔ)介紹:聲明中具有一個(gè)或者多個(gè)類型參數(shù)的類或者接口,就是泛型類或者接口。
例如:List接口就有單個(gè)參數(shù)類型E,表示列表的元素類型。
每個(gè)泛型都定義了一個(gè)原生態(tài)類型。
例如:List<E>相對(duì)應(yīng)的原生態(tài)類型是List。
如果有設(shè)置泛型,則插入錯(cuò)誤的類型,在編譯的時(shí)候就會(huì)出錯(cuò)。如果沒有,則只有當(dāng)在運(yùn)行的時(shí)候(取出強(qiáng)轉(zhuǎn))出錯(cuò)。
如果要使用泛型,但不確定或者不關(guān)心實(shí)際的類型參數(shù),就可以使用一個(gè)問號(hào)代替。
例如:泛型Set<E>的無(wú)限制通配符類型為Set<?>(讀作“某個(gè)類型的集合”)
問:原生態(tài)List和參數(shù)化的類型List<Object>之間到底有什么區(qū)別呢?
答:不嚴(yán)格的說(shuō)前者逃避了泛型檢查,后者則明確告知編譯器,它能夠持有任意類型的對(duì)象。雖然你可以將List<String>傳遞給類型List的參數(shù),但是不能將它傳給類型List<Object>的參數(shù)。泛型有子類型化的規(guī)則,List<String>是原生態(tài)類型的一個(gè)子類型,而不是參數(shù)化類型List<Object>的子類型。
這個(gè)規(guī)則有兩個(gè)小小的例外。
- 在類文字中必須使用原生態(tài)類型。規(guī)范不允許使用參數(shù)化類型(但是允許數(shù)組類型和基本類型)
例如:List.class,String[].class和int.class。 - 由于泛型信息可以在運(yùn)行時(shí)被擦除,因此在此參數(shù)化類型而非無(wú)限制通配符類型上使用instanceof操作符是非法的。用無(wú)限制通配符類型代替原生態(tài)類型,對(duì)instanceof操作符的行為不會(huì)產(chǎn)生任何影響。