鱼C论坛

 找回密码
 立即注册
查看: 563|回复: 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()` 方法改为非静态方法,并将需要的类型参数传递给该方法。例如:

public class Result<T> {
       private Integer code;
       private String message;
       private T data;

       public Result(Integer code, String message, T data) {
           this.code = code;
           this.message = message;
           this.data = data;
       }

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

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

       public static Result<Void> error(String message) {
           return new Result<>(1, message, null);
       }
   }

   使用时可以这样调用:

Result<Integer> result = Result.success(100);
   Result<Void> emptyResult = Result.success();

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

public class ResultUtils {
       public static <T> Result<T> success(T data) {
           return new Result<>(0, "操作成功", data);
       }
   }

   使用时可以这样调用:

Result<Integer> result = ResultUtils.success(100);

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

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

使用道具 举报

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

解决这个问题的方法是,在 `Result` 类的定义中加入泛型类型参数,并在需要使用 `Result` 类的地方指定具体的类型。例如:
public class Result<T> {
    // 省略其他代码
    
    // 快速返回操作成功响应结果(带响应数据)
    public static <T> Result<T> success(T data) {
        return new Result<>(0, "操作成功", data);
    }
    
    // 省略其他代码
}

在快速返回操作成功响应结果的方法中,我使用 `<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()` 方法改为非静态方法,并将需要的类型参数传递给该方法。例如:

public class Result<T> {
       private Integer code;
       private String message;
       private T data;

       public Result(Integer code, String message, T data) {
           this.code = code;
           this.message = message;
           this.data = data;
       }

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

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

       public static Result<Void> error(String message) {
           return new Result<>(1, message, null);
       }
   }

   使用时可以这样调用:

Result<Integer> result = Result.success(100);
   Result<Void> emptyResult = Result.success();

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

public class ResultUtils {
       public static <T> Result<T> success(T data) {
           return new Result<>(0, "操作成功", data);
       }
   }

   使用时可以这样调用:

Result<Integer> result = ResultUtils.success(100);

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 01:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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