java泛型学习

链接: Java 泛型.
链接: Java之泛型.

泛型的本质是类型参数化

java 中泛型标记符:

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ? - 表示不确定的 java 类型

泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

  • 泛型类,如果没有指定具体的数据类型,此时,操作类型是Object
  • 泛型的类型参数只能是类类型,不能是基本数据类型
  • 泛型类型在逻辑上可以看成是多个不同的类型,但实际上都是相同类型

从泛型类派生子类

  • 子类也是泛型类,父类和子类的泛型类型要一致
  • 子类不是泛型类,父类要明确泛型的数据类型
class Child<T> extends Father<T>
class Child extends Father<String>

使用泛型类实现API统一返回结果格式

package com.zm.controller;

import java.io.Serializable;

public class ApiResult<T> implements Serializable {

    private T data;

    private int code;

    private String msg;

    public ApiResult() {

    }

    public ApiResult(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public ApiResult<T> setData(T data) {
        this.data = data;
        return this;
    }

    public ApiResult<T> setCode(Integer code) {
        this.code = code;
        return this;
    }

    public ApiResult<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 请求成功回调
     *
     * @return
     */
    public static ApiResult<?> successMsg() {
        return new ApiResult<>().setCode(200).setMsg("ok");
    }

    /**
     * 请求成功回调
     *
     * @param t 对象参数
     */
    public static <T> ApiResult<T> successMsg(T t) {
        return new ApiResult<>(t).setCode(200).setMsg("ok");
    }

    /**
     * 请求失败回调
     *
     * @param code 状态码
     * @param msg  描述信息
     */
    public static ApiResult<?> errorMsg(int code, String msg) {
        return new ApiResult<>().setCode(code).setMsg(msg);
    }

    /**
     * 请求失败回调
     *
     * @param msg 描述信息
     */
    public static ApiResult<?> errorMsg(String msg) {
        return new ApiResult<>().setCode(500).setMsg(msg);
    }

}


泛型接口

  • 实现类不是泛型类,接口要明确数据类型
  • 实现类也是泛型类,实现类和接口的泛型类型要一致
interface 接口名称 <泛型标识,泛型标识,…> {
	泛型标识 方法名(); 
	.....
}

泛型方法

修饰符 <T,E, ...> 返回值类型 方法名(形参列表) { 方法体... }

泛型通配符

泛型通配符上限

类/接口<? extends 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的子类型

在这里插入图片描述

泛型通配符下限

类/接口<? super 实参类型>
要求该泛型的类型,只能是 实参类型 或 实参类型的父类类型

类型擦除

无限制类型擦除

在这里插入图片描述

有限制类型擦除

在这里插入图片描述

擦除方法中类型定义的参数

在这里插入图片描述

桥接方法

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值