Java编译时的一般错误:“类型参数不在类型变量T的范围内”

时间:2017-08-09 18:32:08

标签: java generics

我正在开发一个代理适配器,使用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)

我在这个问题上花了大约三天时间。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

我认为问题在于,RequestEntity<?>作为第一个参数给出,RequestEntity<?>隐含的通配符参数上限为RequestProxyAdapater并不被认为是确切的相同的类型,但您要求所有类型都为U类型。

我发现,当我无法让泛型合作时,? extends? super会经常修复它。试试这个:

public abstract class ProxyAdapterResolver<U extends HttpEntity<?>, T extends ProxyAdapter<? extends U, ? extends U>> {