java - 不兼容的类型 : capture of ? extends ... 不能转换为捕获?延伸

标签 java generics

我在对象中有一个变量:

private final Map<Long, ? extends MovieInfoDTO> bElementsToAdd = new HashMap<>();

使用Builder模式中的方法我想完成这个 map 。
public Builder withElementsToAdd(@Nullable final Map<Long, ? extends MovieInfoDTO> elementsToAdd) {
     this.bElementsToAdd.clear();
     if(elementsToAdd != null) {
         this.bElementsToAdd.putAll(elementsToAdd);
     }
     return this;
}

但是,我收到一个错误。
    putAll
(java.util.Map<? extends java.lang.Long,? extends capture<? extends com.jonki.popcorn.common.dto.movie.MovieInfoDTO>>)
in Map cannot be applied
to
(java.util.Map<java.lang.Long,capture<? extends com.jonki.popcorn.common.dto.movie.MovieInfoDTO>>)

如何更正这种补充 map 的方法?

最佳答案

简短回答:您不能向具有该类型的 map 添加值。根据经验,您可以阅读 ? extends为“只读”,因此您的 map 是“只读” map MovieInfoDTO对象。

更长的答案:? extends T有点奇怪;当您遇到问题时,类型检查器会考虑类型为 ? extends T 的不同句法出现表达式。是不同的,不兼容的“捕获”,它们的类型检查不相等。所以自从 bElementsToAdd有类型 Map<Long, ? extends MovieInfoDTO> ,然后 bElementsToAdd.put()取一个新的“捕获”值 ? extends MovieInfoDTO .但是没有办法获得同样的捕获!即使你做了 bElementsToAdd.put(k, bElementsToAdd.get(k)) , putget使用不同的捕获,因此它们不是兼容的类型!

您显然不想要只读 map ,因为您正在尝试更新它。所以,你有几个选择。一种是删除通配符——如果您不关心 MovieInfoDTO 的子类型,这是有道理的。你已经有了并且你可以将它们混合在同一张 map 中。如果您确实在意,那么您可能打算为您的整体 map 添加一个边界:

class MyClass<T extends MovieInfoDTO> {
  // ... 
  private final Map<Long, T> bElementsToAdd = new HashMap<>();

  //...
  public Builder withElementsToAdd(@Nullable final Map<Long, T> elementsToAdd) {
   // ...
}

这会强制您在 withElementsToAdd 中添加的元素类型的约束。必须与 map 中的类型具有相同的类型,即使您不关心它是什么类型。

关于java - 不兼容的类型 : capture of ? extends ... 不能转换为捕获?延伸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50380642/

相关文章:

java - Json结构用GET方法获取数据 android studio Retrofit java

java - 泛型 - (elements instanceof List<? extends Comparable>) 的合法替代品

Java:通用类型转换,我该如何解决这个问题,这样我就不会抑制未经检查的警告

java - HashMap 与 ArrayList 中类型参数的实现

java - 为什么在 C++/Java 和类似语言中以美元符号开头的变量名不好?

java - 如何使用 Morphia 获取 MongoDB 的所有非结构化字段

java - 使用 apache.math3.stat.descriptive 的百分位数计算不匹配

java - 抛出应用程序异常会导致TransactionalException

c# - Visual Studio XML 泛型注释

c# - 检查 T 泛型类型是否具有 C# 中的属性 S(泛型)