mumei2018 发表于 2024-1-10 13:18:47

Result <T>类报错 请问是什么问题

代码如下

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
    }
}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-1-10 13:23:32

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

换成你提供的方法后 问题依旧存在

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Result <T>类报错 请问是什么问题