Java泛型入参的三种通配符使用

Java泛型中有三种通配符

1、<? extends xxx>子类界定

2、<? super xxx>超类界定

3、<?>无限定


1、<? extends xxx>子类界定

package com.zjh.test;


import java.io.Serializable;

import com.zjh.test.model.Animal;
import com.zjh.test.model.Horse;
import com.zjh.test.model.LittleHorse;

public class Pair {

    public static <T extends Comparable & Serializable> Animal<T> getAnimal(
            T[] t) {
        T min = t[0];
        T max = t[0];
        for (int i = 1; i < t.length; i++) {
            T key = t[i];
            if (min.compareTo(key) > 0) {

                min = key;
            }

            if (max.compareTo(key) < 0) {

                max = key;
            }
        }
        Animal animal = new Animal<T>(min, max);

        return animal;
    }

    public static <T extends Comparable & Serializable> String getName(T t) {

        return t.toString();

    }

    public static String getHorseName(Animal<? extends Horse> a) {

        return a.getBigger().toString();

    }

    public static void main(String args[]) {

        // Animal animal = getAnimal(new String[] { "zjh", "zcx", "llj", "zst",
        // "lly" });
        // System.out.println(animal.toString());
        //
        // getName(animal);
        LittleHorse lh1 = new LittleHorse("zjh", 26);
        LittleHorse lh2 = new LittleHorse("llj", 27);
        Animal<LittleHorse> animal = new Animal<LittleHorse>(lh1, lh2);
        System.out.print(getHorseName(animal));

    }

}



package com.zjh.test.model;

import java.io.Serializable;

public class Animal<T extends Comparable & Serializable> {

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        String s = "minName:" + t1.toString() + ",maxName:" + t2.toString();
        return s;
    }

    public T getBigger(){
        
        if(t1.compareTo(t2) > 0 ){
            
            return t1;
            
        }else{
            return t2;
        }
    }
    private T t1;
    private T t2;

    public Animal() {
        t1 = null;
        t2 = null;
    }

    public Animal(T t1, T t2) {

        this.t1 = t1;
        this.t2 = t2;
    }
    

}

2、超类限定

与子类限定,直观解释来说,子类限定的通配符用来从入参中读取信息,而父类限定的通配符用来写入代码执行结果信息。

从限定上来说,子类限定时,入参必须是限定类的子类泛型,而父类则是限定类的父类。


public static Animal<? super LittleHorse> getHorse(LittleHorse[] t,
            Animal<? super LittleHorse> a) {
        LittleHorse min = t[0];
        LittleHorse max = t[0];
        for (int i = 1; i < t.length; i++) {
            LittleHorse key = t[i];
            if (min.compareTo(key) > 0) {

                min = key;
            }

            if (max.compareTo(key) < 0) {

                max = key;
            }
        }

        a.setT1(min);
        a.setT2(max);
        return a;
    }


    public static void main(String args[]) {

        // Animal animal = getAnimal(new String[] { "zjh", "zcx", "llj", "zst",
        // "lly" });
        // System.out.println(animal.toString());
        //
        // getName(animal);
//        LittleHorse lh1 = new LittleHorse("zjh", 26);
//        LittleHorse lh2 = new LittleHorse("llj", 27);
//        Animal<LittleHorse> animal = new Animal<LittleHorse>(lh1, lh2);
//        System.out.print(getHorseName(animal));
    
        LittleHorse lh1 = new LittleHorse("zjh", 26);
        LittleHorse lh2 = new LittleHorse("llj", 27);
        LittleHorse lh3 = new LittleHorse("zcx", 25);
        LittleHorse lh4 = new LittleHorse("zst",10);
        LittleHorse [] s = new LittleHorse[]{lh1,lh2,lh3,lh4};
        Horse t1 = new Horse();
        Horse t2 = new Horse();
        Animal<Horse> animal = new Animal<Horse>(t1, t2);
        //可以编译
        Animal<?> animal2 = getHorse(s,animal);
        System.out.println(animal2.getBigger().toString());
        LittleHorse lt1 = new LittleHorse();
        LittleHorse lt2 = new LittleHorse();
        Animal<LittleHorse> animal_test = new Animal<LittleHorse>(lt1, lt2);
    //无法编译
        //getHorse(animal_test);
    }


3、<?>无限定




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值