首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 7泛型:如何访问泛型类型的方法?

Java 7泛型:如何访问泛型类型的方法?
EN

Stack Overflow用户
提问于 2018-09-09 12:41:53
回答 1查看 539关注 0票数 1

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

代码语言:javascript
复制
@AllArgsConstructor
@Getter
public class Request<T> {
    int Id;
    T requestContext;
}

以下是其中一种requestContext类型:

代码语言:javascript
复制
@AllArgsConstructor
@Getter
public class StudentRequestContext {
    int ID;
    String name;
}

我有一个ResponseGenerator接口:

代码语言:javascript
复制
public interface ResponseGenerator {
    <T> Response getResponse(Request<T> request);
}

下面是这个接口的实现者类:

代码语言:javascript
复制
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。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-11 01:44:17

public <StudentRequestContext> Response getResponse(...意味着您将StudentRequestContext声明为类型变量,此方法在该变量上是泛型的。它与上面名为StudentRequestContext的类完全无关。当您在方法中使用类型StudentRequestContext时,它引用的是为此方法声明的类型变量,而不是类中的类型。

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

代码语言:javascript
复制
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本身的类型参数相同:

代码语言:javascript
复制
public interface ResponseGenerator<T> {
    Response getResponse(Request<T> request);
}

然后,您的StudentResponseGenerator类可以使用特定类型作为类型参数来实现该接口:

代码语言:javascript
复制
public class StudentResponseGenerator implements ResponseGenerator<StudentRequestContext> {
    @Override
    public Response getResponse(Request<StudentRequestContext> studentRequest) {
        // ...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52241404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档