Java 泛型 - 令人困惑的行为

2024-01-10

我无法理解为什么我在这里遇到编译错误。让我分享一些简单的代码。下面的代码块工作正常:

public class Test {
  public static void main(String[] args) {
    String[] arr = new String[0];
    MethodA(arr);
  }

  public static <E> void MethodA(E[] array) {
    Integer[] intArray = new Integer[0];
    MethodB(array, intArray);
  }

  public static <E> void MethodB(E[] array, E[] secondArray) {
    //Stuff
  }
}

当我向 MethodB 添加新的通用 List 参数并从 MethodA 调用它时,问题就出现了:

public class Test {
  public static void main(String[] args) {
    String[] arr = new String[0];
    MethodA(arr);
  }

  public static <E> void MethodA(E[] array) {
    Integer[] intArray = new Integer[0];
    List<E> someList = new ArrayList<E>();
    MethodB(array, intArray, someList);
  }

  public static <E> void MethodB(E[] array, E[] secondArray, List<E> list) {
    //Stuff
  }
}

这给了我以下错误:

线程“main”java.lang.Error中出现异常:未解决的编译问题: Test 类型中的方法 MethodB(E[], E[], List) 不适用于参数 (E[], Integer[], List)

它似乎在告诉我将参数从 E[] 更改为 Integer[],这很奇怪,因为直到我引入 List 参数之后它才抱怨这样的事情。我再次觉得我一定在某个地方犯了一个愚蠢的错误,但我无法弄清楚。任何帮助,将不胜感激!谢谢!


在第一个示例中,您调用MethodB with a String[] and an Integer[].

由于数组是“协变”的 - 这意味着,例如,您可以转换String[] to an Object[],它调用的版本MethodB with Object for E.

在第二个示例中,它是类似的,但你还有一个List<E>。通用类做not与数组的工作方式相同 - 你cannot cast a List<String> to a List<Object>。所以 E 是无效的Object(或者除 E 之外的任何内容MethodA) 之后第三个参数就无法转换了,E 也无效String从那时起第一个参数无法转换。所以没有适合的类型E.

注意:如果你改变了String to Integer in main,它仍然无法编译,尽管E可能Integer。那是因为编译器不知道MethodA从未被其他任何东西调用过Integer.

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

Java 泛型 - 令人困惑的行为 的相关文章

随机推荐

  • 训练 Tesseract 特定单词 - 可能吗?

    我想使用 Tesseract 从文档中提取大约 10 20 个关键字 该文档将包含所有英文字符 单词 我感兴趣的是 年龄 23 之类的东西 这里 Age 是我感兴趣的关键字 也想提取 23 它的值 我想到的第一个方法是将整个页面提取为文本
  • 多边形轮廓上的边并不总是正确的

    我使用下面的算法来生成四边形 然后将其渲染以形成如下所示的轮廓 http img810 imageshack us img810 8530 uhohz png http img810 imageshack us img810 8530 uh
  • Python 从并行目录导入模块

    我将如何组织我的 python 导入 以便我可以拥有这样的目录 project init py src init py classes py test init py tests py 然后在 project test tests py 中
  • 完成所有登录过程后如何获取ExternalIdentity?

    我正在使用 MVC 5 我可以使用 Google 成功登录 我想在登录过程后访问用户的外部身份声明 例如 我想在视图中访问用户的声明 图片 但是 如果我尝试运行此代码 它总是返回 null 登录过程中除外 自动生成 mvc 模板代码 有没有
  • 解构赋值默认值[重复]

    这个问题在这里已经有答案了 我正在学习 javascript 在解构时尝试为变量提供默认值时 我有点受困于 ES6 语法 基本上 我试图分配一个变量 为其提供对象属性的值 如果该值为 false null undefined 我希望它是一个
  • 按组选择前 N 个值

    这是为了回应r help 邮件列表上提出的问题 http r 789695 n4 nabble com top 10 n values for each classes tt4658074 html a4658095 这里有lots示例数
  • 如何使用 gmail api 和 chrome 扩展将 gmail 保存为 .eml 文件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 gmail api 的新手 正在开发 chrome 扩展 它将选定的电子邮件保存为 eml 或 msg 文件 我已成功获取当前
  • 显示最初隐藏的无模型对话框

    我有无模型的子对话框 在资源属性中 可见标志设置为 true 根据我在资源属性中的要求 可见标志应该为 true 我想在最初显示时以编程方式隐藏对话框 我重写了 presubclasswindow 并使用下面的代码删除了 WS VISIBL
  • 是否有一个 SaxParser 可以读取 json 并触发事件,使其看起来像 xml

    这会很棒 因为它允许我的 xml 内容读取 json 除了不同的 sax 解析器之外 无需任何更改 如果您的意思是基于事件的解析器 那么有几个项目可以做到这一点 http code google com p json simple http
  • 在Visual Studio中设置添加类快捷键

    我曾经使用快捷键 Ctrl Shift C 在 Visual Studio 2015 中添加一个新类 当我使用另一台机器时 这似乎已经消失了 我该如何设置这个 我查看了 选项 gt 环境 gt 键盘 但看不到任何明显的东西 导航Tools
  • 如何获取箱子尺寸的总重量,例如12 x 160g 等于 1.92kg

    不确定这是否可能 但是 假设我在表中有这样的列 12 x 60g 12 x 160g 500g 1kg 1kg 12 x 160g 12 x 250g 有些是单独尺寸 有些是外壳尺寸 是否可以获得每行的总重量 如果是的话 会怎样做呢 e g
  • 通过键盘将焦点移至 Visual Studio 2008/Visual Studio 2010 中的下一个选项卡组?

    是否可以使用键盘移至 Visual Studio 2008 或 2010 中的下一个垂直选项卡组 有一些命令可将活动窗口移动到下一个或上一个选项卡组 但我找不到用于将焦点从一个选项卡组移动到下一个选项卡组的命令 我发现的唯一解决方法是使用
  • android studio 0.8.14 beta 不支持 Path.approximate()

    渲染问题 不支持 Path approximate 解析文件失败 sdk platforms android 21 data res drawable progress medium material xml添加后出错ProgressBar
  • ActiveRecord::Base.connection.execute 受影响的行

    在 Rails 4 1 1 中 使用 mysql2 适配器 我正在使用 ActiveRecordconnection http apidock com rails ActiveRecord Base connection在 MySQL 表中
  • numpy.asarray:如何检查其结果数据类型是否为数字?

    我必须创建一个numpy ndarray来自具有 int float 或复数的类似数组的数据 我希望能做到numpy asarray功能 我不想给它一个严格的dtype参数 因为我想将复数值转换为complex64 or complex12
  • Mysql 使用日期数据行 ORDER BY

    我有一个这样的查询 SELECT title desc date FROM tablename ORDER BY date ASC title ASC 当数据确实有日期时 效果很好 问题是 日期提交是可选的 因此我有时会得到 0000 00
  • IIS 上的 django-wkhtmltopdf:[WinError 6] 句柄无效

    这是我的第一个问题 所以如果我忘记了要提及的内容或者有什么问题 请原谅我 我在 IIS 10 Windows Server 上设置了一个 python 3 5 3 django 2 1 5 项目 一切都很好 Problem 只有 wkhtm
  • 如何在主队列上同步调度而不发生死锁?

    我需要在主队列上同步调度一个块 我不知道我当前是否在主线程上运行 天真的解决方案如下所示 dispatch sync dispatch get main queue block 但是 如果我当前位于主队列上运行的块内 则此调用会造成死锁 同
  • 如何使用 sails 在控制台日志中显示查询?

    我正在使用 sails 和 mysql 启动一个项目 我不知道如何配置它以显示在控制台中执行的查询 mysql 适配器有一个调试变量 LOG QUERIES 用于将所有查询发送到控制台 LOG QUERIES true node myFil
  • Java 泛型 - 令人困惑的行为

    我无法理解为什么我在这里遇到编译错误 让我分享一些简单的代码 下面的代码块工作正常 public class Test public static void main String args String arr new String 0