鱼C论坛

 找回密码
 立即注册
查看: 228|回复: 3

[已解决]Result <T>类报错 请问是什么问题

[复制链接]
发表于 2024-1-10 13:18:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下

package com.itheima.big_evnet.pojo;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;


@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;//业务状态码  0-成功  1-失败
    private String message;//提示信息
    private T data;//响应数据

    //快速返回操作成功响应结果(带响应数据)
    public static <E> Result<E> success(E data) {
        return new Result<> (0, "操作成功", null);   // 这行的报错信息是 Cannot infer type arguments for Result<>
    }

    //快速返回操作成功响应结果
    public static Result success() {
        return new Result(0, "操作成功", null);    //   这行的报错信息是 The constructor Result(int, String, null) is undefined
    }

    public static Result error(String message) {
        return new Result(1, message, null);     //     这行的报错信息是The constructor Result(int, String, null) is undefined
    }
}
最佳答案
2024-1-10 13:23:46
mumei2018 发表于 2024-01-10 13:23
换成你提供的方法后 问题依旧存在


抱歉,我之前的回答有误。在 Java 中,静态方法无法直接使用类定义的泛型类型,因为泛型类型是与实例相关联的。解决这个问题的方法有两种:

1. 将 `success()` 方法改为非静态方法,并将需要的类型参数传递给该方法。例如:

  
  1. public class Result<T> {
  2.        private Integer code;
  3.        private String message;
  4.        private T data;

  5.        public Result(Integer code, String message, T data) {
  6.            this.code = code;
  7.            this.message = message;
  8.            this.data = data;
  9.        }

  10.        public static <T> Result<T> success(T data) {
  11.            return new Result<>(0, "操作成功", data);
  12.        }

  13.        public static Result<Void> success() {
  14.            return new Result<>(0, "操作成功", null);
  15.        }

  16.        public static Result<Void> error(String message) {
  17.            return new Result<>(1, message, null);
  18.        }
  19.    }
复制代码


   使用时可以这样调用:

  
  1. Result<Integer> result = Result.success(100);
  2.    Result<Void> emptyResult = Result.success();
复制代码


2. 如果你希望 `success()` 方法保持静态方法,并且仍然想要返回带有泛型类型的 `Result` 对象,可以考虑将 `success()` 方法定义在一个单独的工具类中,该工具类带有泛型类型参数。例如:

  
  1. public class ResultUtils {
  2.        public static <T> Result<T> success(T data) {
  3.            return new Result<>(0, "操作成功", data);
  4.        }
  5.    }
复制代码


   使用时可以这样调用:

  
  1. Result<Integer> result = ResultUtils.success(100);
复制代码


希望这次能够帮助到你,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-10 13:18:57 | 显示全部楼层
在上面的代码中,`Result` 类定义了一个泛型 `T`,但是没有指定 `T` 的具体类型。所以编译器无法确定 `data` 字段的类型。

解决这个问题的方法是,在 `Result` 类的定义中加入泛型类型参数,并在需要使用 `Result` 类的地方指定具体的类型。例如:

  1. public class Result<T> {
  2.     // 省略其他代码
  3.    
  4.     // 快速返回操作成功响应结果(带响应数据)
  5.     public static <T> Result<T> success(T data) {
  6.         return new Result<>(0, "操作成功", data);
  7.     }
  8.    
  9.     // 省略其他代码
  10. }
复制代码


在快速返回操作成功响应结果的方法中,我使用 `<T>` 来声明该方法是泛型方法,并在 `Result` 类型之前加上 `<T>`,表示该方法返回的是一个具有泛型类型的 `Result` 对象。

使用这样修改后的 `Result` 类,你就可以正确地实例化 `Result` 对象并指定具体的类型了。

希望可以帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-10 13:23:32 | 显示全部楼层
FishC 发表于 2024-1-10 13:18
在上面的代码中,`Result` 类定义了一个泛型 `T`,但是没有指定 `T` 的具体类型。所以编译器无法确定 `data ...

换成你提供的方法后 问题依旧存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-10 13:23:46 | 显示全部楼层    本楼为最佳答案   
mumei2018 发表于 2024-01-10 13:23
换成你提供的方法后 问题依旧存在


抱歉,我之前的回答有误。在 Java 中,静态方法无法直接使用类定义的泛型类型,因为泛型类型是与实例相关联的。解决这个问题的方法有两种:

1. 将 `success()` 方法改为非静态方法,并将需要的类型参数传递给该方法。例如:

  
  1. public class Result<T> {
  2.        private Integer code;
  3.        private String message;
  4.        private T data;

  5.        public Result(Integer code, String message, T data) {
  6.            this.code = code;
  7.            this.message = message;
  8.            this.data = data;
  9.        }

  10.        public static <T> Result<T> success(T data) {
  11.            return new Result<>(0, "操作成功", data);
  12.        }

  13.        public static Result<Void> success() {
  14.            return new Result<>(0, "操作成功", null);
  15.        }

  16.        public static Result<Void> error(String message) {
  17.            return new Result<>(1, message, null);
  18.        }
  19.    }
复制代码


   使用时可以这样调用:

  
  1. Result<Integer> result = Result.success(100);
  2.    Result<Void> emptyResult = Result.success();
复制代码


2. 如果你希望 `success()` 方法保持静态方法,并且仍然想要返回带有泛型类型的 `Result` 对象,可以考虑将 `success()` 方法定义在一个单独的工具类中,该工具类带有泛型类型参数。例如:

  
  1. public class ResultUtils {
  2.        public static <T> Result<T> success(T data) {
  3.            return new Result<>(0, "操作成功", data);
  4.        }
  5.    }
复制代码


   使用时可以这样调用:

  
  1. Result<Integer> result = ResultUtils.success(100);
复制代码


希望这次能够帮助到你,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表