我有一个 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/