java - 具有多个类型参数的通用辅助方法

标签 java arrays generics

我有一个 WebTarget POST 调用,每次调用都会使用不同的参数和不同的反序列化类来多次调用。因此,我想将 WebTarget 代码抽象为一种仅接受参数的方法,同时允许我在一个调用失败时而不停止其他调用。

这是当前的 WebTarget 调用(下面列出的 3 个 Token.* 类是 Token 的内部类,它们也扩展了 Token,Text 是一个简单的包装类):

 Token[] profileLocationTokens = target.request().post(Entity.json(new Text(profileLocationText)), Token.ProfileLocationToken[].class);

 Token[] profileDescriptionTokens = target.request().post(Entity.json(new Text(profileDescriptionText)), Token.ProfileDescriptionToken[].class);

 Token[] statusTexttokens = target.request().post(Entity.json(new Text(statusText)), Token.StatusTextToken[].class);

我想创建类似于下面的方法:

private Token[] execPost(WebTarget target, String content, Class tokenClass) {
    try {
        return target.request().post(Entity.json(new Text(content)), tokenClass);
    } catch (javax.ws.rs.BadRequestException bre) {
            LOG.error(bre.getMessage());
}

我知道我需要使类通用并以某种方式或其他方式传递类型,但是我已经尝试了我能想到的所有方法,并且每次我收到编译时“推理变量具有不兼容的边界”错误时。另一个让我困惑的问题是我传入子类的类(例如 Token.ProfileLocationToken)进行反序列化并将结果引用为父类(super class),所以我试图创建有界类型......没有成功。

我没有在类里面的其他地方使用泛型;类型定义将来自同一类中的调用方法。

如果有人可以帮助我展示如何正确创建该方法,使其按照我希望的方式工作,我将不胜感激。

编辑 1 根据请求,以下是我尝试的几种方法。请注意,我的尝试无处不在,我还没有使用泛型的经验。我还遇到了试图将其强制放入我的类类型数组中的问题。

我首先尝试使用以下方法:

private <T extends Token>Token[] execPost(WebTarget target, String content, T tokenClass) {
    try {
        return target.request().post(Entity.json(new Text(content)), tokenClass);
    } catch (javax.ws.rs.BadRequestException bre) {
        LOG.error(bre.getMessage());
    }
}

出现以下错误:

method javax.ws.rs.client.SyncInvoker.<T>post(javax.ws.rs.client.Entity<?>,java.lang.Class<T>) is not applicable
  (cannot infer type-variable(s) T 
   (argument mismatch; T cannot be converted to java.lang.Class<T>))
method javax.ws.rs.client.SyncInvoker.<T>post(javax.ws.rs.client.Entity<?>,javax.ws.rs.core.GenericType<T>) is not applicable
  (cannot infer type-variable(s) T
    (argument mismatch; T cannot be converted to javax.ws.rs.core.GenericType<T>))
<小时/>

我还尝试让它返回 T,然后在分配返回的数组时将其引用为 Token[]:

private <T extends Token>T[] execPost(WebTarget target, String content, Class<T> tokenClass) {
    try {
        return target.request().post(Entity.json(new Text(content)), tokenClass);
    } catch (javax.ws.rs.BadRequestException bre) {
        LOG.error(bre.getMessage());
    }
}

出现以下编译错误:

equality constraints: T
    upper bounds: T[],java.lang.Object

虽然编译器错误的描述性较差,但 Netbeans 表示如下:

inference variable T#1 has incompatible bounds
    equality constraints: T#2
    upper bounds: T#2[],Object
where T#1, T#2 are type-variables:
    T#1 extends Object declared in method <T#1>post(Entity<?>,Class<T#1>)
    T#2 extends Token declared in method <T#2>execPost(WebTarget,String,Class<T#2>)

最佳答案

签名可以是

private <T extends Token> T[] execPost(WebTarget target, String content, Class<T> tokenClass) {

请注意,在这种情况下,您传递的是数组中的类型,而不是数组类型。

关于java - 具有多个类型参数的通用辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35773317/

相关文章:

C:指针分配错误

java - 用于对 Java 集合(List、Set)进行排序的通用比较器

java - 使用 ResteasyClient 时 AWS API Gateway 出现 SSLHandShakeException

java - 在 tomcat servlet 中检测客户端断开连接?

java - 即使预先初始化,Java的拆分是否会覆盖数组的长度?

javascript - 我怎样才能更好地写出这份报告候选人的功能呢?

java - 静态工厂模式返回类型中的有界通配符

generics - 具有通配符泛型类型的 Lambda

java - 如何制作按钮监听器组方法?

java - Azure 上带有命令行参数的 Spring Boot 应用程序