不兼容的通配符类型应该兼容[重复]

2024-01-05

继从这个问题 https://stackoverflow.com/questions/4459587/incompatible-generic-wildcard-captures,它提供了一个解决方案,但没有解释它(不幸的是,答案中的链接现在已失效):

采取以下方法:

void method(Map<?, ?> myMap) {
    Set<Map.Entry<?, ?>> set = myMap.entrySet();
    ...
}

很简单,不是吗?但是,在 jdk1.7.0_25 上编译失败:

incompatible types
required: java.util.Set<java.util.Map.Entry<?,?>>
found:    java.util.Set<java.util.Map.Entry<capture#1 of ?,capture#2 of ?>>

WTF? Map.entrySet()被指定为返回类型的对象Set<Map.Entry<K, V>>,所以在上面的例子中,myMap.entrySet()返回一个Set<Map.Entry<?, ?>>。但它无法编译!

更奇怪的是,从顶部的链接问题来看,将方法更改为这样可以使其编译:

void method(Map<?, ?> myMap) {
    Set<? extends Map.Entry<?, ?>> set = myMap.entrySet();
    ...
}

WTF???呼唤entrySet on a Map<?, ?>返回一个Set<Map.Entry<K, V>>,不能分配给类型的变量Set<Map.Entry<K, V>>,但它可以是类型变量Set<? extends Map.Entry<K, V>>?????

任何人都可以阐明这里发生的事情吗?这是否意味着,每当我使用通配符类型编写至少 2 级深度的方法时,我必须记住使其? extends ...某处?


其中每一个?可以独立变化,所以不能保证<?,?>在声明中myMap匹配<?,?>在声明中set.

这意味着一旦我有了Set<Map<?,?>>,我可以把any类型Map进入该集合,因为Map<?,?>是所有类型的超类型Map。但这不是一个财产Set<Map<String,Integer>>(例如)有-就我可以放入其中的地图类型而言,它的限制性要大得多。所以Set<Map<?,?>>不是 的超类型Set<Map<String,Integer>>. But myMap.entrySet()很容易成为Set<Map<String,Integer>>,取决于什么myMap是。所以编译器必须禁止我们将它分配给类型的变量Set<Map<?,?>>,这就是正在发生的事情。

另一方面,Set<? extends Map<?,?>> is的超类型Set<Map<String,Integer>>, 因为Map<String,Integer>是一个子类型Map<?,?>。所以赋值就OK了myMap.entrySet()到一个类型的变量Set<? extends Map<?,?>>.

请注意,没有什么特别的String and Integer在这里,但是myMap必须是一张地图某物!

你可以写

<K, V> void method(Map<K, V> myMap) {
    Set<Map.Entry<K, V>> set = myMap.entrySet();
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不兼容的通配符类型应该兼容[重复] 的相关文章

随机推荐

  • 如何防止 IE 缓存导致重复的 Ajax 请求?

    我们使用Dynamic Sc ript Tag配合JsonP机制来实现跨域Ajax调用 前端小部件非常简单 它只是调用搜索 Web 服务 传递用户提供的搜索条件并接收和动态呈现结果 Note 对于那些不熟悉使用 JsonP 方法的动态脚本标
  • 从 Android 应用程序发送 POST 请求到 Django 视图

    我正在尝试从 Android 设备读取 QRCode 并将提取的 ID 发送到使用 Django 构建的 Web 服务器 我按照教程进行操作here http hmkcode com android send json data to se
  • css中的字符串连接

    我想在css中实现以下目标 我如何以跨浏览器的方式做到这一点 url img icons attr type 10 png 我认为你不能 在里面content属性你可以通过用空格分隔来 连接 但在其他地方我认为没有这样的功能 这是一种耻辱
  • 无法将文件移动到已安装的网络共享文件夹

    我正在尝试将文件上传到办公网络共享文件夹 我有权让我的用户帐户访问共享文件夹 我使用 UNC 路径直接通过 move upload file 函数上传文件 但它不起作用 我收到此错误 警告 move uploaded file 17 105
  • 从多列中选择值到单列中

    我在数据库中有一个表 其中有 9 列 其中包含相同类型的数据 这些值是允许为空 我需要将每个非空值选择到一列值中 这些值不关心它们源自的行的标识 因此 对于看起来像这样的表 Id I1 I2 I3 1 x1 x2 x7 2 x3 null
  • AFNetworking 2 - 获取错误 json 正文 [重复]

    这个问题在这里已经有答案了 我用的是最新的AF网络对于我的应用程序 它与 REST API 服务器通信 当我得到一些500JSON 主体出现错误 如下所示 message my error message 我无法从以下位置检索此消息NSEr
  • 将导航抽屉添加到现有活动

    我正在编写一个应用程序 它已经包含很多代码 我决定要向主活动工具栏添加一个导航抽屉 但我不知道如何在不创建新的导航抽屉项目和复制的情况下做到这一点我的整个项目看起来工作量很大 是否有教程可以向现有项目添加导航抽屉 创建布局布局左菜单 xml
  • 将 Json 反序列化为 C# bool

    我需要帮助解决一个非常简单的问题 如何在不创建包装根对象的情况下将下面的 json 反序列化为 C bool 谢谢 f valid false 0 如果您正在使用Json Net http james newtonking com json
  • 我们如何才能使 __future__ 进口全球化?

    规格 Python 2 7 我正在开发一个具有多个模块的项目 我想激活所有模块中 future 模块的一些功能 我想在一个模块上导入我需要的所有功能 然后将该单个模块导入到每个其他模块 并使这些功能在所有模块中处于活动状态 或者达到这种效果
  • 为什么 W3C 建议将输入元素包装在

    标记中?

    我在网上看到了很多示例 其中表单的布局如下
  • android 设计注意事项:AsyncTask 与 Service(IntentService?)

    我正在设计一个 Android 应用程序 需要执行以下步骤 用户按下按钮或以其他方式指示 同步数据 同步过程将使用 REST Web 服务将数据移入和移出服务器 数据将存储在本地 SQLite 数据库中 同步过程应向 UI 提供状态更新 消
  • 如何在Python(Windows)中获取Spotify当前正在播放的歌曲?

    我想在 16x2 LCD 上显示 Spotify 中当前播放的歌曲 我正在考虑将 LCD 与我的 Arduino 连接起来 然后制作一个 Python 脚本 将 Spotify 当前播放的歌曲发送到 Arduino 言归正传 我正在寻找一种
  • MyISAM 上的全文索引,单列索引与多列索引

    我有一个非常大的表 4M 行 磁盘空间超过 40Gb 14Gb 数据和 28Gb 索引 我需要对组合和分离的多个字段进行全文搜索 这意味着我需要能够对单列和多列一起进行全文搜索 如下所示 用于组合搜索 SELECT column a col
  • 在 Python 中加速 Metropolis-Hastings 算法

    我有一些使用 MCMC 对后验分布进行采样的代码 特别是黑斯廷斯大都会 https en wikipedia org wiki Metropolis E2 80 93Hastings algorithm 我使用 scipy 生成随机样本 i
  • 如何使用 mvcsitemapprovider 将自定义 xml 标签添加到 sitemap.xml?

    基于 Google 的定义视频站点地图 https developers google com webmasters videosearch sitemaps 有一些xml标签应该添加到视频的站点地图中 应该是这样的
  • 我应该使用 Jenkins CI 服务器将 WAR 文件部署到 Tomcat 吗?

    我最近开始使用詹金斯来持续集成我的项目 它构建一个 WAR 文件 使用 Maven 和一个 Android 应用程序 使用 Ant 我还想自动将 WAR 的夜间构建部署到我的 Tomcat 测试服务器上 并将我的 Android 应用程序部
  • 如何使用列表中的名称创建新列

    我在网上搜索帖子以找到解决方案 但是 我无法识别任何 因此 我决定寻求你的帮助 我有一个包含数据框的列表 我从每个数据框中选择了某些列并将它们组合起来 当我组合两个数据框中的数据时 我想添加一个包含列表名称的列 但是 我无法实现这一点 这是
  • 尝试在 Android 上执行 MRC 或 MCR 指令时获取 ILL_ILLOPC(非法操作码)

    我正在使用 ARM Assembly 尝试访问多个协处理器寄存器 每当我有类似的事情 mcr p15 1 r1 c1 c0 or mrc p15 0 r0 c1 c0 I get signal 4 SIGILL code 1 ILL ILL
  • 如何在打字稿中声明带有部分特定键的“记录”类型?

    现在 我得到了这个 type T PlatformKey pf1 pf2 pf3 type T PlatformInfo key T PlatformKey name string k string any 我想声明一个 记录 类型 如下所
  • 不兼容的通配符类型应该兼容[重复]

    这个问题在这里已经有答案了 继从这个问题 https stackoverflow com questions 4459587 incompatible generic wildcard captures 它提供了一个解决方案 但没有解释它