java 泛型的上限與下限


設置泛型對象的上限使用extends,表示參數類型只能是該類型或該類型的子類:

聲明對象:類名<? extends 類> 對象名

定義類:類名<泛型標簽 extends 類>{}

設置泛型對象的下限使用super,表示參數類型只能是該類型或該類型的父類:

聲明對象:類名<? super 類> 對象名稱

定義類:類名<泛型標簽 extends類>{}

 

public static void  show(List<? extends Number> l){

 

}

public static void  show(List<? super String> l){

 

}

public static void show(List<? extends Number> l){}

public static void show(List<? super String> l){}

 

泛型的上限

 

public static void main(String[] args) {

        Person<Integer> p1 = new Person<>();

        p1.setVal(99);

        Person<Double> p2 = new Person<>();

        p2.setVal(3.14);

        Person<String> p3 = new Person<>();

        p3.setVal("007");

        show(p1);//√

        show(p2);//√

        show(p3);//×

    }

    public static void show(Person<? extends Number> p){//此處限定了Person的參數類型只能是Number或者是其子類,而String並不屬於Number。

        System.out.println(p.getVal());

    }

 

泛型的下限

 

    public static void main(String[] args) {

        Person<Integer> p1 = new Person<>();

        p1.setVal(99);//Integer

        Person<Double> p2 = new Person<>();

        p2.setVal(3.14);//Double

       

        Person<String> p3 = new Person<>();

        p3.setVal("007");//String

        Person<Object> p4 = new Person<>();

        p4.setVal(new Object());//Object

 

        show(p1);//×

        show(p2);//×

        show(p3);//√

        show(p4);//√

    }

    public static void show(Person<? super String> p){

        System.out.println(p.getVal());

    }

 

很好的例子!

package generic;

 

import java.util.ArrayList;

import java.util.List;

 

public class GenericDemo3 {

    public static void main(String[] args) {

        //因為show方法是用List<?>通配符接收的,所以可以是任意類型!

        List<String> l1 = new ArrayList<>();//new ArrayList<String>()

        show(l1);

        List<Double> l2 = new ArrayList<>();

        show(l2);

        List<Number> l3 = new ArrayList<>();

        show(l3); 

        List<Object> l4 = new ArrayList<>();

        show(l4);

        //使用up方法的話接收類型為Number或者其子類

        //up(l1);//錯誤,因為up方法接收類型為Number或者其子類,l1(String)不符合!

        up(l2);

        up(l3);

        //使用down方法的話接收類型為Number或者其父類

        //down(l2);error

        down(l3);

        down(l4);

    }

public static void down(List<? super Number> l){

       

        for (Object object : l) {

            System.out.println(object);

        }

    }

public static void up(List<? extends Number> l){

       

        for (Object object : l) {

            System.out.println(object);

        }

    }

    public static void show(List<?> l){

       

        for (Object object : l) {

            System.out.println(object);

        }

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM