泛型 一 泛型方法 擦除 邊界

2021-08-21 15:36:19 字數 972 閱讀 5115

class myholder

public t get()

public void set(t a)

}class testmyholder

}

泛型即「引數化型別」。

用t表示型別引數,用尖括號括住t,放在類名後面,這樣類中的成員(屬性和方法)就可以使用t了。當我們new出乙個myholder例項s0,指定s0持有的型別引數為string,則建構函式、set()能夠訪問到類上的型別引數t,知道t是string,建構函式、set()就只接受string型別的實參。同理,在s0的say()返回值型別的是string。

建立第二個myholder例項i0時,指定型別引數t為integer,與s0一對比,myholder類名上的t就像是乙個引數,可以接各種型別,且只接受型別,不接受123,"abc"等這些具體的值(也不接受基本型別)。所以t叫做型別引數。

叫做引數列表,列表中的型別引數可以有多個,如:

將泛型引數列表置於返回值前的方法叫做泛型方法。

static方法不能訪問類上的型別引數,如果static方法需要使用泛型能力,就必須將static方法定義為泛型方法。

class myholderstatic

}

class testwipe 

}

泛型擦除:在靜態**檢查階段jvm知道型別引數具體是什麼型別,如:myholder的型別引數是string,myholder的型別引數是integer。但是在執行時,jvm會將型別引數刪掉,myholder、myholder都被擦除為原生型別myholder。通過s0.getclass().gettypeparameters()可以知道,我們的本意是獲取s0、i0的型別引數,但是在執行時僅能獲取到型別引數的佔位符t,而沒能獲取到string、integer。

在實際程式設計中,獲取型別引數卻僅僅得到佔位符,其實就相當於沒有獲取到任何有用的資訊。

泛型 泛型類 泛型方法 泛型擦除

1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...

Java泛型擦除

class person public class test else 上面的例子執行 equal這裡列印出equal的原因,list和list list擦除後的型別都是list,沒有任何區別。其實泛型的class物件都是相同的,泛型化不會改變class屬性的返回值。再看看下面的例子 private...

泛型擦除補償

由於在使用泛型的時候,將會擦除型別引數,而只保留原始型別。所以在使用泛型時,我們不能使用new t 也不能使用instanceof,因為這兩類操作要知道確切的型別。此問題的解決方案有三種 設計模式的使用 簡單工廠 最簡單 工廠方法 最靈活 模板方法 最簡捷 1.簡單工廠 在此方法中,將型別作為引數,...