新聞中心
我相信,絕大多數(shù)初始Java泛型的同學(xué)都會(huì)感到這個(gè)知識(shí)點(diǎn)理解起來(lái)有些困難,在這里我會(huì)對(duì)java泛型相關(guān)知識(shí)點(diǎn)做一個(gè)詳細(xì)的介紹,包括:入門泛型必懂的知識(shí)點(diǎn)、通配符、泛型擦除以及泛型應(yīng)用四個(gè)內(nèi)容。今天我來(lái)講解第一個(gè)知識(shí)點(diǎn):入門泛型必懂的知識(shí)點(diǎn)。先幫大家掃清泛型基礎(chǔ)概念的相關(guān)知識(shí)點(diǎn),也歡迎大家持續(xù)關(guān)注我的后續(xù)文章。

泛型定義
泛型的英文是 generics,generic 的意思是通用,而翻譯成中文,泛應(yīng)該意為廣泛,型是類型。所以泛型就是能廣泛適用的類型。但泛型還有一種較為準(zhǔn)確的說(shuō)法就是為了參數(shù)化類型,或者說(shuō)可以將類型當(dāng)作參數(shù)傳遞給一個(gè)類或者是方法。我們通過(guò)兩個(gè)實(shí)例對(duì)比來(lái)了解使用泛型和好處。
1.不使用泛型的實(shí)例
- public class ValueDemo {
- Object value;
- public Object getValue() {
- return value;
- }
- public void setValue(Object value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemo demo = new ValueDemo();
- demo.setValue(888);
- int value = (int) demo.getValue();
- demo.setValue("hello");
- String value1 = (String) demo.getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
2.使用泛型的實(shí)例
- public class ValueDemoT
{ - T value;
- public T getValue() {
- return value;
- }
- public void setValue(T value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemoT
demo = new ValueDemoT (); - demo.setValue(888);
- Integer value = demo.getValue();
- ValueDemoT
demo1 = new ValueDemoT (); - demo1.setValue("hello");
- String value1 = demo1 .getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
通過(guò)上面的例子我們可以發(fā)現(xiàn)使用泛型的好處主要有三點(diǎn):
1.相對(duì)于Object 代替一切類型這種方式,泛型不再需要對(duì)取出來(lái)的結(jié)果進(jìn)行強(qiáng)制轉(zhuǎn)換了!泛型使得數(shù)據(jù)的類型可以像參數(shù)一樣由外部傳遞進(jìn)來(lái),實(shí)現(xiàn)類型參數(shù)化。
2.泛型參數(shù)一旦確定好,如果類型不匹配,編譯器就不通過(guò)。如下圖所示:
這是一種類型安全檢測(cè)機(jī)制,一定程度上提高了軟件的安全性防止出現(xiàn)低級(jí)的失誤。
3.泛型提高了程序代碼的可讀性,不必要等到運(yùn)行的時(shí)候才去強(qiáng)制轉(zhuǎn)換,在定義或者實(shí)例化階段,因?yàn)?ValueDemoT 這個(gè)類型顯化的效果,程序員能夠一目了然猜測(cè)出代碼要操作的數(shù)據(jù)類型。
泛型類、泛型方法和泛型接口
泛型按照使用情況可以分為 3 種。
- 泛型類。
- 泛型方法。
- 泛型接口。
泛型類
- public class Demo
{ - T field1;
- }
實(shí)例化方法如下:
- Demo
demo1=new Demo <>(); - Demo
demo2 =new Demo<>();
泛型方法
泛型方法必須以進(jìn)行聲明,其中包括有參方法和無(wú)參方法,具體代碼如下
- public class Demo {
- //無(wú)返回值的方法
- public
void testMethod1(T t){ - //code
- }
- //有返回值的方法
- public
T testMethod2(T t){ - return null;
- }
- }
泛型接口
泛型接口與泛型類的定義及使用基本相同,代碼如下:
- public interface DemoT
{ - public T test();
- }
泛型上下邊界
在使用泛型的時(shí)候,我們還可以為傳入的泛型類型實(shí)參進(jìn)行上下邊界的限制。
— 泛型的參數(shù)使用extends關(guān)鍵字表示參數(shù)只能接受類class和其子類。這里的class是上限。
— 泛型的參數(shù)使用super關(guān)鍵字表示參數(shù)只能接受類class和其父類。這里的class是下限。
使用的代碼如下:
- public class Vehicle {
- public void drive() {};
- public void brake() {};
- }
- public class Car extends Vehicle {
- public void drive() {
- System.out.println("car的drive方法");
- };
- public void brake() {
- System.out.println("car的brake方法");
- };
- }
- public class Benz extends Car{
- public void drive() {
- System.out.println("benz drive");
- };
- }
定義一個(gè)泛型方法
- public class CarT {
- public static void main(String[] args) {
- getCar(new Benz());
- getCar(new Car());
- getCar(new Vehicle()); //IDE報(bào)錯(cuò)
- }
- public static
void getCar(T car) { - car.drive();
- }
可以看到方法getCar(T car) 中的參數(shù)只能傳入 Car類或者其子類的實(shí)例,而Car的父類Vehicle的實(shí)例則不能傳入!super的使用跟extends類似,這里就不再詳細(xì)講解了
泛型的注意點(diǎn)
1.泛型方法中的泛型參數(shù)與類的泛型參數(shù)沒(méi)有關(guān)聯(lián),代碼如下:
- public class Demo1
{ - public
T testMethod1(T t){ - return t;
- }
- public static void main(String[] args) {
- Demo1
demo=new Demo1 (); - Integer i=demo.testMethod1(new Integer(123));
- System.out.println(i);
- }
- }
可以看到Demo1 和testMethod1(T t)可以賦值不同的類型,前者是String而后者是 Integer。
2.出于規(guī)范的目的,泛型中的T 只是一種習(xí)慣性寫法,我們可以把替換為其他標(biāo)識(shí),例如。常見(jiàn)的其他約定寫法如下:
- T 代表一般的任何類。
- E 代表 Element 。
- K 代表 Key 。
- V 代表 Value,通常與 K 一起配合使用。
3.泛型可以有多個(gè)參數(shù),我們以2個(gè)參數(shù)為例,代碼如下:
- public class ValueDemoT2 {
- A value1;
- B value2;
- public void setValue(A p_value1,B p_value2) {
- value1 = p_value1;
- value2 = p_value2;
- }
- public static void main(String[] args) {
- ValueDemoT2
demo = new ValueDemoT2 (); - demo.setValue(123456,"hello");
- System.out.println(demo.value1);
- System.out.println(demo.value2);
- }
- }
執(zhí)行代碼輸出:
- 123456
- Hello
4.泛型類或者泛型方法中,不接受 8 種基本數(shù)據(jù)類型。例如下面代碼則無(wú)法編譯通過(guò)
- List
li = new ArrayList<>();
網(wǎng)頁(yè)名稱:詳解Java泛型之入門泛型必懂的知識(shí)點(diǎn)
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/dhcoegp.html


咨詢
建站咨詢
