当前位置: 首页 > 知识库问答 >
问题:

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

和季
2023-03-14

我正在开发一个代理适配器,使用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);
    }
}
Error:(11, 108) java: type argument br.com.afferolab.attendancelist.core.proxy.service.RequestProxyAdapter<?,?> is not within bounds of type-variable T

从Java中的泛型类型推断泛型类型(编译时错误)

我在那个问题上花了大约三天时间。有什么想法吗?谢了。

共有1个答案

马安邦
2023-03-14

我认为问题在于,作为第一个参数给出的RequestEntity<?>RequestProxyAdapater隐含的通配符参数上限RequestEntity<?>没有被视为完全相同的类型,而是要求它们都是类型U

我发现当我难以让泛型协同工作时,?扩展还是?super经常会修复它。试试这个:

public abstract class ProxyAdapterResolver<U extends HttpEntity<?>, T extends ProxyAdapter<? extends U, ? extends U>> {
 类似资料:
  • 问题内容: 我正在为一个涉及泛型的类项目。 当尝试在MySearchTree的声明中使用Course类时,我收到一个类型自变量错误,指出“课程不在类型变量K的范围内”。我花了很多时间试图弄清楚Course可能缺少哪些属性,以使其不符合要求,但却空洞了。 有任何想法吗? 问题答案: 在的基本类型为。因此必须“扩展” 。但是,它没有扩展。 我猜 应该以类似的方式对泛型 或 。

  • 我正在开发一个小的android演示应用程序,其中混合了一些java类和接口与kotlin。我想从一个名为MvpViewStateActivity的具有泛型类型参数的java类扩展: 其中只是一个空的java接口: MvpPresenter是这样一个java接口: 和SearchViewActivity(Java): 所以现在我创建了一个kotlin接口: 其中,Item是pojo数据类。 也是用

  • 这基本上是我第一次接触Java泛型类型,我不知道下面的代码有什么问题。 我有一个helper类,它具有一个静态函数inRange-usng-generic类型,该函数应该从输入列表中返回对象列表,这些对象在索引处的对象周围的特定范围内(我还没有测试它,如果它工作正常与否,这不是问题): 然后我想在一个类中使用它: 类型为

  • 问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 问题内容: 我在写一些代码,遇到编译错误。这就是我所拥有的: 我以为使用继承时没有正确声明泛型,所以我检查了Oracle的教程,他们在其中编写 上面的声明使用相同的泛型类型,这是我在示例中要完成的工作。似乎假设from 与from 有所不同。否则,它应该能够 将 两者 合并并看到相同的类型。如何正确实现我要实现的目标? ( 即,某物的常量是某物的值,这是同一物的表达 ) 问题答案: 您的变量定义为