Java泛型全解析

泛型接口和类

public class Fruit<T> {
    private T info;

    public Fruit(T info) {
        this.info = info;
    }

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    public static void main(String[] args) {
        Fruit<String> lt = new Fruit<String>("苹果");
        System.out.println(lt.getInfo());
        Fruit<Integer> intg = new Fruit<Integer>(1);
        System.out.println(intg.getInfo());
    }
}

可以灵活的封装,并且同时有可以限定类型,泛型的接口和类更像是一种通用的模型,模型内部的类型由使用者自己限定

无论为泛型的类型形参传入哪一种类型的实参,对于Java来说,他们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。

泛型接口和类的子类

public class Apple extends Fruit<String>{

    public Apple(String info) {
        super(info);
    }

    @Override
    public String getInfo() {
        return super.getInfo();
    }

}
  • 使用泛型接口或类的时候,虽然可以不加<>部分,但是推荐加上,不然还要强制类型转换等麻烦操作

  • 重写父类方法或者实现接口的时候,返回值一定要跟父类(接口)一致。

设定类型形参的上限
public class Fruit<T extends String & java.io.Serializable> {
    private T info;

    public Fruit(T info) {
        this.info = info;
    }

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    public static void main(String[] args) {
        Fruit<String> lt = new Fruit<>("苹果");
        System.out.println(lt.getInfo());
        Fruit<?> intg = new Fruit<>("1");
        System.out.println(intg.getInfo());
    }
}
  • 可以有多个限定条件,存在多个限定条件的时候,使用&连接

  • 至多一个父类上限,多个接口上限

  • 接口上限要在类上线后面

类型通配符

使用类型通配符的类是各种该类的泛型的父类

public class Fruit<T> {
    private T info;

    public Fruit(T info) {
        this.info = info;
    }

    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    public static void main(String[] args) {
        Fruit<String> lt = new Fruit<>("苹果");
        System.out.println(lt.getInfo());
        Fruit<?> intg = new Fruit<>(1);
        System.out.println(intg.getInfo());
    }
}
  • 在Java 7以后可以使用菱形语法,在构造器后不需要完整的泛型信息

  • "?"用于操作具体的某个泛型类的时候,还未确定最终使用时,采用的对象类型,就用问号作为占位的含义

通配符的上限设定
Fruit<? extends String> intg = new Fruit<>("1");
  • 使用extends的方式限定?必须是String类型或者是其子类类型

通配符的下限设定
    static <T,B> void getCollection(Fruit<? super T>b){
        System.out.println(b);
    }
  • 一定要是T或者T的父类

泛型方法

public class Fruit<T extends String & java.io.Serializable> {
    private T info;

    public Fruit(T info) {
        this.info = info;
    }
    static <T,B> void getCollection(B[]b){
        System.out.println(b);
    }
    public T getInfo() {
        return info;
    }

    public void setInfo(T info) {
        this.info = info;
    }

    public static void main(String[] args) {
        Fruit.getCollection(new String[]{"1"});
    }
}

存在泛型构造器,不能使用”菱形“语法

 public class Fruit {

    public <O> Fruit(O info) {
        //this.info = info;
    }
}

//这样会报错
Fruit<String> fruit = new Fruit("");

参考:https://segmentfault.com/a/1190000005339802

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值