我正在开发一个使用Java 7的遗留应用程序。我有一个通用的请求类(注释来自lombok):
@AllArgsConstructor
@Getter
public class Request<T> {
int Id;
T requestContext;
}
以下是其中一种requestContext类型:
@AllArgsConstructor
@Getter
public class StudentRequestContext {
int ID;
String name;
}
我有一个ResponseGenerator接口:
public interface ResponseGenerator {
<T> Response getResponse(Request<T> request);
}
下面是这个接口的实现者类:
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。我遗漏了什么?
发布于 2018-09-11 01:44:17
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
类可以使用特定类型作为类型参数来实现该接口:
public class StudentResponseGenerator implements ResponseGenerator<StudentRequestContext> {
@Override
public Response getResponse(Request<StudentRequestContext> studentRequest) {
// ...
}
}
https://stackoverflow.com/questions/52241404
复制相似问题