我正在开发一个代理适配器,使用Java中的泛型将请求/响应转换为另一个请求/响应。
我有一个界面:
public interface ProxyAdapter<FROM, TO> {
TO adapt(FROM o);
}
适配器的实现(仅使用请求案例作为示例):
public interface RequestProxyAdapter<FROM, TO> extends ProxyAdapter<RequestEntity<FROM>, RequestEntity<TO>> { }
抽象类:
public abstract class ProxyAdapterResolver<U extends HttpEntity<?>, T extends ProxyAdapter<U, U>> {
private final Map<String, T> adapters;
private final T defaultAdapter;
public ProxyAdapterResolver(Collection<T> adapters, T defaultAdapter) {
this.adapters = adapters.stream()
.collect(Collectors.toMap(this::proxyNameResolver, Function.identity()));
this.defaultAdapter = defaultAdapter;
}
// other methods...
}
具体类:
@Component
public class RequestProxyAdapterResolver extends ProxyAdapterResolver<RequestEntity<?>, RequestProxyAdapter<?, ?>> {
@Autowired
public RequestProxyAdapterResolver(Collection<RequestProxyAdapter<?, ?>> allAdapters) {
super(allAdapters, a -> a);
}
}
编译时发生异常,进入具体类 RequestProxyAdapterResolver 。这是堆栈跟踪:
Error:(11, 108) java: type argument br.com.afferolab.attendancelist.core.proxy.service.RequestProxyAdapter<?,?> is not within bounds of type-variable T
obs:class RequestEntity 来自org.springframework.http包
异常很明显,我在堆栈溢出中读到了一些关于这个问题的问题。但是我无法找到解决方案。例如:
Java generics issue: Class "not within bounds of type-variable" error.
Type argument T is not within bounds of type-variable T(Java Generic)
Inferring a generic type from a generic type in Java (compile time error)
我在这个问题上花了大约三天时间。有任何想法吗?感谢。
答案 0 :(得分:1)
我认为问题在于,RequestEntity<?>
作为第一个参数给出,RequestEntity<?>
隐含的通配符参数上限为RequestProxyAdapater
并不被认为是确切的相同的类型,但您要求所有类型都为U
类型。
我发现,当我无法让泛型合作时,? extends
或? super
会经常修复它。试试这个:
public abstract class ProxyAdapterResolver<U extends HttpEntity<?>, T extends ProxyAdapter<? extends U, ? extends U>> {