gpt4 book ai didi

Java 7 通用 : How to access method of generic type?

转载 作者:行者123 更新时间:2023-12-02 10:50:06 25 4
gpt4 key购买 nike

我正在开发一个使用 Java 7 的遗留应用程序。我有一个通用的 Request 类(注释来自 lombok):

@AllArgsConstructor
@Getter
public class Request<T> {
int Id;
T requestContext;
}

这是 requestContext 类型之一:

@AllArgsConstructor
@Getter
public class StudentRequestContext {
int ID;
String name;
}

我有一个 ResponseGenerator 接口(interface):

public interface ResponseGenerator {
<T> Response getResponse(Request<T> request);
}

这是该接口(interface)的实现类:

public class StudentResponseGenerator implements ResponseGenerator {
@Override
public <StudentRequestContext> Response getResponse(
Request<StudentRequestContext> studentRequest) {
StudentRequestContext studentRequestContext =
(StudentRequestContext) studentRequest.getRequestContext();
studentRequestContext.get //NO getName METHOD IS AVAILABLE
}
}

如上面的代码注释所示,StudentResponseGenerator 类中的泛型类型 StudentRequestContext 对象没有可用的 getter。我错过了什么?

最佳答案

public <StudentRequestContext> Response getResponse(...意味着您声明 StudentRequestContext作为此方法通用的类型变量。它与名为StudentRequestContext的类完全无关。多于。当您使用类型StudentRequestContext时在方法内部,它引用为此方法声明的类型变量,而不是类中的类型。

为了避免混淆,您可以将类型变量重命名为 U ,这与上面的完全等效:

public <U> Response getResponse(
Request<U> studentRequest) {
U studentRequestContext =
(U) studentRequest.getRequestContext();
studentRequestContext.get //NO getName METHOD IS AVAILABLE
}

看看问题是什么?变量studentRequestContext类型为U (无界限的类型变量),它没有名为 getName 的方法.

签名<T> Response getResponse(Request<T> request);意味着与您可能想要的不同的东西。签名<T> Response getResponse(Request<T> request);意味着实现方法必须接受 Request 类型的参数任何 类型参数(您可以等效地将签名写为 Response getResponse(Request<?> request);)。

您可能想要的是使界面通用,并拥有其 getResponse方法接受 Request 类型的参数特定类型参数的一个,与ResponseGenerator的类型参数相同。本身:

public interface ResponseGenerator<T> {
Response getResponse(Request<T> request);
}

然后你的StudentResponseGenerator类可以使用特定类型作为类型参数来实现该接口(interface):

public class StudentResponseGenerator implements ResponseGenerator<StudentRequestContext> {
@Override
public Response getResponse(Request<StudentRequestContext> studentRequest) {
// ...
}
}

关于Java 7 通用 : How to access method of generic type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52241404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com