在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java 泛型問題

java 泛型問題

本問題需要對泛型有深刻了解,原理題主明白,只是不明白我下面說明的這個問題

代碼如下

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)與類對象的聲明的情況是相同的。

2018年7月26日 21:28