本問題需要對泛型有深刻了解,原理題主明白,只是不明白我下面說明的這個問題
代碼如下
public class Shape implements Comparable<Shape> {
@Override
public int compareTo(Shape o) {
return 0;
}
}
public class Square extends Shape {
}
public class TestGenetic {
public static <AnyType extends Comparable<? super AnyType>> AnyType findMax(AnyType[] arr){
int maxIndex=0;
for (int i = 0; i <arr.length ; i++) {
if (arr[i].compareTo(arr[maxIndex+1])>0)
maxIndex=i;
}
return arr[maxIndex];
}
public static void main(String[] args) {
Shape[] shapes={new Shape(),new Shape()};
Square[] squares={new Square(),new Square()};
findMax(shapes);
findMax(squares);
}
}
若修改一下泛型泛型方法中的泛型:
public class TestGenetic {
public static <AnyType extends Comparable<AnyType>> AnyType findMax(AnyType[] arr){
int maxIndex=0;
for (int i = 0; i <arr.length ; i++) {
if (arr[i].compareTo(arr[maxIndex+1])>0)
maxIndex=i;
}
return arr[maxIndex];
}
public static void main(String[] args) {
Shape[] shapes={new Shape(),new Shape()};
Square[] squares={new Square(),new Square()};
findMax(shapes);
findMax(squares);
}
}
同樣不會報錯
但是,在泛型類中則不是這樣
public class TestGeneric1<AnyType extends Comparable<? super AnyType>> {
public static void main(String[] args) {
TestGeneric1<Square> p=null;
}
}
這種不會報錯,但是,如果我修改一下泛型,如下:
public class TestGeneric1<AnyType extends Comparable<AnyType>> {
public static void main(String[] args) {
TestGeneric1<Square> p=null;//編譯報錯
}
}
則編譯報錯,請問為什么在泛型類中會進行泛型檢查,而泛型方法中不進行檢查呢,在泛型方法中,Square明明不符合AnyType extends Comparable<AnyType>這一條件呀
請指教,謝謝
都會檢查,只是要求不同。
方法的泛型參數(shù)其實會在兩個地方檢查:在調(diào)用時和獲取返回值時。
你的例子里面僅調(diào)用了方法,并沒有獲取它的返回值,因此只檢查了一次。
對調(diào)用參數(shù)的檢查是相對寬松的,它僅會檢查傳入的參數(shù)是否符合方法泛型的下界。
而對返回值的檢查就比較嚴格了,它會檢查返回值的接收類型是否符合方法泛型的上界。這一點與聲明類對象的時候是一樣的。
具體來說,當(dāng)調(diào)用方法的時候,如果我傳入的是一個Square,但方法泛型要求的是一個Shape(通過<AnyType extends Comparable<AnyType>>)。這種時候是可以通過編譯的,因為編譯器會把這個Square參數(shù)當(dāng)做Shape對待,也就是向上轉(zhuǎn)型。這是完全沒有問題的,因為任何Shape的子類都是Shape。
但是,當(dāng)獲取返回值的時候就不同了,如果你用一個Shape變量獲取,這是沒有問題的,因為它本身就符合泛型的要求。但如果你用一個Square變量來獲取就不行了,因為這樣定義的方法它只能返回Shape,因此無法自動向下轉(zhuǎn)型為Square。
聲明類對象的時候與獲取方法返回值是同樣的道理。
所以在你的例子中,修改后,聲明類對象無法通過編譯,但方法調(diào)用可以。如果你測試返回值,你會發(fā)現(xiàn)與類對象的聲明的情況是相同的。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。