天天看點

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) {

        p1.setVal(99);//Integer

        p2.setVal(3.14);//Double

        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){

很好的例子!

package generic;

import java.util.ArrayList;

import java.util.List;

public class GenericDemo3 {

        //因為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){

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