Java 泛型捕获列表

2023-11-26

我正在看Java 泛型文档并找到了这段代码,

public class WildcardError {

void foo(List<?> l) {
    //This give a compile time error
    l.set(0,l.get(0));
}
}

我可以理解我们正在从 a 中获取一个元素List<?>并尝试将其设置为另一个List<?>。所以编译器会报错。我的问题是,当两个列表不同时,即有意义l.set(0, m.get(0))这里列出了l and m是不同的。但在上面的例子中,l and l是相同的列表。为什么编译器不够聪明,看不到这一点?实施起来难吗?

Edit: 我知道我可以通过辅助方法或使用来修复它T代替?。只是想知道为什么编译器不为我做这件事。


根据您的具体情况,您可以明确修复此问题:

public class WildcardError {
    <T> void foo(List<T> l) {
        // This will work
        l.set(0, l.get(0));
    }
}

或者,如果您不想更改原始 API,请引入委托辅助方法:

public class WildcardError {
    void foo(List<?> l) {
        foo0(l);
    }

    private <T> void foo0(List<T> l) {
        // This will work
        l.set(0, l.get(0));
    }
}

不幸的是,编译器无法推断出“显而易见”<T>类型。我也一直想知道这个问题这似乎是编译器中可以改进的东西,因为每个通配符都可以非正式地转换为未知的<T>类型。也许,有一些原因导致了这一点被省略,也许这只是直觉,但形式上是不可能的。

UPDATE:

注意,我刚刚看到了这个特殊的实现Collections.swap():

public static void swap(List<?> list, int i, int j) {
    final List l = list;
    l.set(i, l.set(j, l.get(i)));
}

JDK 人员求助于原始类型,以便在本地处理此问题。这是一个强有力的声明,表明这可能should得到编译器的支持,但由于某种原因(例如,缺乏时间正式指定这一点)没有完成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 泛型捕获列表 的相关文章

随机推荐

  • 使用 Unicode 数据加载FromFile

    我的输入文件 f 有一些无法正确读取的Unicode 瑞典语 这些方法都不起作用 尽管它们给出了不同的结果 LoadFromFile f or LoadFromFile f TEncoding GetEncoding GetOEMCP 我正
  • 在Python中查找列表中所有单词的字符数

    我试图找到单词列表中的字符总数 特别是这个列表 words alpha omega up down over under purple red blue green 我尝试过这样做 print The size of the words i
  • 以编程方式禁用应用程序中的屏幕截图

    我想防止在应用程序中截取页面的屏幕截图 如何以编程方式执行此操作 以便无法截取屏幕截图 找到检测屏幕截图的代码 截图后可以立即删除吗 let mainQueue NSOperationQueue mainQueue NSNotificati
  • Eclipse 不会让我的应用程序运行

    我正在尝试在手机上安装我制作的应用程序 但我不断收到错误 Installation error INSTALL PARSE FAILED NO CERTIFICATES 我正在使用 Eclipse 我以前从未见过这个问题 我已经在手机上运行
  • 使用附加文件在 YARN 集群上运行 Spark 作业

    我正在编写一个简单的 Spark 应用程序 它使用一些输入 RDD 通过管道将其发送到外部脚本 并将该脚本的输出写入文件 驱动程序代码如下所示 val input args 0 val scriptPath args 1 val outpu
  • 如何从状态数组中删除一个项目?

    故事是 我应该能够把鲍勃 莎莉和杰克放进一个盒子里 我也可以从盒子中取出其中一个 移除后 不会留下任何插槽 people Bob Sally Jack 我现在需要删除 Bob 新的数组将是 Sally Jack 这是我的反应组件 getIn
  • 在 Go 中升级到 TLS 的连接

    我有一个打开的 TCP 连接 并使用 for 循环从中读取内容 如下所示 for tx Text is of type textproto Conn the underlying connection is stored in tx Con
  • Python 字符串末尾有空格和无空格以及不变性

    我了解到在一些不可变的类中 new 可能会返回一个现有的实例 这就是int str and tuple类型有时适用于小值 但为什么以下两个片段的行为不同呢 末尾有一个空格 gt gt gt a string gt gt gt b strin
  • 如何在 Excel 2007 中从 VBA 访问复选框

    添加复选框时 如何从 VBA 访问该值 在 Excel 2007 中 在开发人员功能区上 插入 表单控件 复选框 将复选框重命名为 chkMyCheck 将宏添加到复选框 我现在有带有 chkMyCheck Clicked 的 Module
  • 超出 UIView 范围的交互

    当 UIButton 的框架位于其父级框架之外时 UIButton 或任何其他控件 是否可以接收触摸事件 因为当我尝试这个时 我的 UIButton 似乎无法接收任何事件 我该如何解决这个问题 是的 您可以覆盖hitTest withEve
  • 在 iOS 中处理不同的 URL 方案(Facebook 和 Instagram)

    我什至不知道如何定义这个问题 但它就是这样 我有一个使用 Facebook SDK 进行用户登录的应用程序 我按照 Facebook 授权教程进行操作 我不是 100 确定它是如何工作的 但这部分在我的 AppDelegate m 中似乎很
  • 如何将浮点数转换或转换为其位序列,例如长整型

    再会 我在 16 位 C 环境中工作 我想将浮点值转换为其位序列 例如整数值 我知道有多种方法可以实现这一目标 一种是通过工会 另一种是通过工会 例如 union ConvertFloatToInt float input unsigned
  • .NET4.0 不完全支持 EF 5 是否存在技术原因?

    我想将我的应用程序升级到 EF 5 以利用对枚举空间的支持等功能 但是 除非迁移到 Net 4 5 否则我无法升级 我想知道 EF 5 使用了 Net 4 5 的哪些功能而在 Net 4 0 中无法实现 我的理解是 EF gt 4 1 包括
  • 将坐标从 EPSG 3857 转换为 4326

    我的数据库中有一个 EPSG 3857 格式的坐标列表 我需要将它们转换为 EPSG 4326 我正在尝试使用 DotSpatial 但我的代码总是重新调整 Infinity 的双数组 public double ConvertCoodin
  • 动态增加/减少数组大小

    我正在尝试动态增加数组的大小 是否有任何标准 C 或 C 函数可以在数组末尾添加额外空间或将其删除 我知道 这很困难 因为不能保证堆末尾有足够的空间 但这不应该是操作系统的工作吗 您正在寻找的功能是realloc 在 C 中 它也存在于 C
  • 奇怪的 numpy fft 性能

    在测试过程中我注意到一些奇怪的事情 我对很多向量进行 FFT 有时 numpy FFT 函数似乎会崩溃 我对此进行了简要调试 发现某些向量长度触发了该行为 偶然间 我保持了一个脚本的运行 令我惊讶的是 它没有崩溃 只是花了更长的时间 有谁知
  • 调用 forRoot 时,Angular 延迟加载不起作用

    我有一个延迟加载模块 需要公开提供程序 所以我使用forRoot约定并返回以下代码 NgModule imports RouterModule forChild path component LazyComponent declaratio
  • 网站上从用户本地时间到 UTC 的日期/时间转换

    我目前正在向网站添加一个类似外出的系统 用户可以在其中标记他们的外出日期和时间 以便他们可以提供其他用户的信息 以便在外出时用作备份 我遇到的问题是将用户的本地时间转换为 UTC 我见过其他帖子通过向用户提供 UTC 并让客户端 js 将时
  • 使用 matplotlib 作为日期刻度的语言为英语

    我的母语是法语 所以我的操作系统界面 GNU Linux Xubuntu 是法语 因此 当我使用 Matplotlib 绘制时间序列时datetime作为 X 数据 返回的图有用法语写的月份 我如何获得其他语言 通常是英语 的打印日期 您可
  • Java 泛型捕获列表

    我正在看Java 泛型文档并找到了这段代码 public class WildcardError void foo List并尝试将其设置为另一个List