java的泛型

一。泛型的作用

用来限制输入数据或者参数的类型

public class test7{

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("qqyumidi");
        list.add("corn");
        list.add(100);

        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i); // 这里会报错,因为get是string类型的方法,不能用到int类型中
            System.out.println("name:" + name);
        }
    }
}

为了避免这种错误,可以让list只放一种数据类型,在他的入口加以限制。

public class test7{
    public static void main(String[] args) {
        List <String> list = new ArrayList();
//        list.add(100);会发生编译错误,这样就能确保list中只有string类型
            list.add("aa");
        for (int i = 0; i < list.size(); i++) {
            String name = (String) list.get(i);
            System.out.println("name:" + name);
        }
    }
}

 自定义泛型类

就是在定义时并不指明该方法的具体的类型,而是用E来代替,在调用时再给,给了之后,类中的所有出现E的地方都会是那个类型。

package com.reflection;

public class test7 {
    public static void main(String[] args) {
     Boxx<String> boxx1= new Boxx<String>("ss");
        Boxx<Integer> boxx2= new<Integer> Boxx(100);
//     boxx1.setdata(10000);会报错,因为boxX1中的参数T全部是String类型
        System.out.println(boxx1.returndata());
        System.out.println(boxx2.returndata());
    }
}
class Boxx<T> {
    Boxx(T a) {
        this.data = a;
    }
    private T data;
    public T returndata() {
        return data;
    }
    public void setdata(T b) {
        this.data=b;
    }
}

泛型方法的类型通配符

泛型方法就是把泛型作为参数的方法。
这就是个泛型方法,它只接受 map,而且map的key是String类型,value是User类型
 public static void display(Map<String,User> a)
    {
       System.out.println(a);
    }
Number是integer的父类,但是在泛型中不能这么写,下面的例子会报错
public class GenericTest {

    public static void main(String[] args) {

        Box<Number> name = new Box<Number>(99);
        Box<Integer> age = new Box<Integer>(712);

        getData(name);

        //The method getData(Box<Number>) in the type GenericTest is
        //not applicable for the arguments (Box<Integer>)
        getData(age);   // 1

    }

    public static void getData(Box<Number> data){
        System.out.println("data :" + data.getData());
    }

}

所以我想写一个方法,不仅对String参数的该类使用,也能对其他参数的该类使用,就要用到类型通配符,如下

public class GenericTest {

    public static void main(String[] args) {

        Box<String> name = new Box<String>("corn");
        Box<Integer> age = new Box<Integer>(712);
        Box<Number> number = new Box<Number>(314);

        getData(name);
        getData(age);
        getData(number);
    }

    public static void getData(Box<?> data) {
        System.out.println("data :" + data.getData());
    }

}

通配符上限和下限

通配符上限,是为了让函数只能执行某个类型和他的子类,

通配符下线,是为了让函数只能执行某个类型和他的父类

类型通配符上限通过形如Box<? extends Number>形式定义,相对应的,类型通配符下限为Box<? super Number>形式

public class GenericTest {

    public static void main(String[] args) {

        Box<String> name = new Box<String>("corn");
        Box<Integer> age = new Box<Integer>(712);
        Box<Number> number = new Box<Number>(314);

        getData(name);
        getData(age);
        getData(number);

        //getUpperNumberData(name); // 有错误,因为string类型不是number的子类
        getUpperNumberData(age);    // 没问题
        getUpperNumberData(number); // 没问题
    }

    public static void getData(Box<?> data) {
        System.out.println("data :" + data.getData());
    }

    public static void getUpperNumberData(Box<? extends Number> data){
        System.out.println("data :" + data.getData());
    }

}

Java总结篇系列:Java泛型 - HappyCorn - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值