Java静态方法和泛型

前言

在写web接口的时候想定义一个通用的返回类,用到了泛型,在定义静态方法创建类对象的时候发现静态方法无法使用泛型。于是进行了一番研究。

形如下面代码块中的静态方法是无法定义的。因为泛型类中的静态方法不能使用类的泛型而应该将该方法定义为泛型方法。

public static AjaxResult<T> error(Integer aaa, T data, Integer aa) {
        return null;
    }

在java中泛型只是一个占位符,必须在传递类型后才能使用。就泛型而言,类实例化时才能正真的的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数静态的方法就已经加载完成了。

那什么是泛型方法呢?简单理解就是具有泛型的方法。。(跟没说一样)我们需要仔细研究一下上面方法为啥不能使用。

一言以蔽之,上面静态方法的泛型是类的泛型。静态方法不是不能拥有泛型,而是必须使用自己的泛型,而不是泛型类的泛型,也就是上面红字。

那么如何定义自己的泛型呢?

//第一个U表示(也就是定义)该方法的泛型,后面两个U是使用的第一个U   
public static <U> AjaxResult<U> success(U data) {
        return new AjaxResult<>(200, "操作成功", data);
    }

代码

 

import java.util.HashMap;

/**
 * @author kenn
 * 封装响应数据,所有前端调用都要返回一个AjaxResult
 */
public class AjaxResult<T> extends HashMap<String, Object> {

    /**
     * 状态码
     */
    public static final String CODE_TAG = "code";
    /**
     * 返回内容
     */
    public static final String MSG_TAG = "msg";

    /**
     * 数据对象
     */
    public static final String DATA_TAG = "data";

    /**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */
    public AjaxResult() {}

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public AjaxResult(Integer code, String msg, T data) {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (null != data) {
            super.put(DATA_TAG, data);
        }
    }

    //下面为了与类的泛型进行区别,特意使用了U作为静态方法的泛型,也就是说静态方法的泛型跟类的泛型是两个不同的泛型参数
    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static <U> AjaxResult<U> success(String msg, U data) {
        return new AjaxResult<>(200, msg, data);
    }

    public static <U> AjaxResult<U> success(U data) {
        return new AjaxResult<>(200, "操作成功", data);
    }


    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static <U> AjaxResult<U> error(String msg, U data) {
        return new AjaxResult<>(500, msg, data);
    }

    public static <U> AjaxResult<U> error(U data) {
        return new AjaxResult<>(500, "操作失败", data);
    }

}

一些要注意的地方写到上面代码的注释中去了,不明白的话可以再仔细看一遍代码的注释。

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java静态属性泛型是指在Java中,我们可以在静态属性上使用泛型类型。通过在静态属性的类型声明中添加泛型参数,我们可以在静态属性中使用泛型类型,从而使静态属性具有泛型的特性。 举例来说,我们可以定义一个拥有泛型类型的静态属性,如下所示: public class MyClass<T> { public static T staticField; } 在上面的例子中,我们通过在静态属性staticField的类型声明中添加了泛型参数T,使得静态属性具有泛型的特性。这样,我们就可以根据实际情况在不同地方使用不同类型的静态属性。 需要注意的是,在静态属性中使用泛型类型时,由于静态属性属于类而不是对象,所以泛型类型参数不能是实例化类型,而必须是类级别的类型。也就是说,不能使用泛型类型参数T来实例化静态属性,而只能使用具体的类型来实例化。 因此,使用静态属性时,我们需要确保在静态属性的类型声明中正确地使用泛型类型参数,并在使用时传入具体的类型来实例化静态属性。这样,就可以在静态属性中使用泛型类型了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java 中的泛型(两万字超全详解)](https://blog.csdn.net/weixin_45395059/article/details/126006369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值