当前位置: 首页 > 面试题库 >

Java varargs方法参数列表与数组

雷飞虎
2023-03-14
问题内容

Varargs:

public static void foo(String... string_array) { ... }

单数组参数:

public static void bar(String[] string_array) { ... }

Java 1.6似乎接受/拒绝以下内容:

String[] arr = {"abc", "def", "ghi"};
foo(arr);  // accept
bar(arr);  // accept
foo("abc", "def", "ghi");  // accept
bar("abc", "def", "ghi");  // reject

假设以上内容是正确的,为什么不总是使用varargs而不是单个数组参数呢?似乎免费增加了呼叫者的灵活性。

如果有,专家可以共享内部JVM的不同吗?

谢谢。


问题答案:

数组从Java的开始就出现了,而varargs是最近才添加的。因此,许多旧代码仍然很高兴地使用数组。

还要注意,使用显式数组参数调用通用vararg方法可能会静默地产生与预期不同的行为:

public <T> void foo(T... params) { ... }

int[] arr = {1, 2, 3};

foo(arr); // passes an int[][] array containing a single int[] element

因此,除了需要大量的工作并没有明显的好处之外,用varargs替换遗留数组参数并不总是可取的。

更不用说您不能这样做的情况,因为方法参数列表中的数组后面还有另一个参数:

public void foo(String[] strings, String anotherParam) { ... }

重新排序参数可以从技术上解决此问题,但是这会破坏客户端代码。

更新: 有效的Java 2nd。Edition,条款42: 明智地使用varargs
进行了详细说明,并给出了一个具体示例:Arrays.asList()在Java5中进行了改装以具有vararg参数,使用此(现在已过时)惯用法打印时,
无意中破坏了很多现有代码 可能会导致意外数组:

System.out.println(Arrays.asList(myArray));

Update2: 仔细检查了源,并说原始类型的数组(例如)出现了问题int[]。在varargs之前,代码如下:

int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };
System.out.println(Arrays.asList(digits));

会产生编译错误,因为只有引用类型的数组可以转换为List。由于使用了varargs并进行了改造asList,因此上面的代码在编译时不会发出警告,并且意外的结果类似于"[[I@3e25a5]"



 类似资料:
  • 本文向大家介绍Vue.js Ajax动态参数与列表显示实现方法,包括了Vue.js Ajax动态参数与列表显示实现方法的使用技巧和注意事项,需要的朋友参考一下 Vue.js简介 vue是法语中视图的意思,Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API。 一、动态参数显示 ajax异步请求后,接收到返回的data参数并显示在前端 1.1 引入js,也加入了jQue

  • 问题内容: 我有一个方法: 该方法位于jar中,我无法访问其源代码。因此,我需要以并行方式执行invokList,有人可以为此提供帮助吗? 想法是将列表拆分为多个列表,然后并行执行invokList。 我做了这个例子: 问题答案: 看起来很冗长,但是您可以尝试以下方法。该方法将使列表块并行运行。 我 为30个 整数 列表 运行,其 块大小为5, 如下所示: 输出 :

  • 我有一个方法: 这个方法在一个jar中,我无法访问它的源代码。因此,我需要以并行方式执行invokList,有人能帮我吗? 这个想法是将列表拆分为多个列表并并行执行invokList。 我举了一个例子:

  • 列参数定义在 jQuery.fn.bootstrapTable.columnDefaults。 名称 标签 类型 默认 描述 radio data-radio Boolean false 是否显示为单选按钮 checkbox data-checkbox Boolean false 是否显示为筛选框 field data-field String undefined 字段名称 title data-

  • 我有一个方法,它被用作: 模拟遵循的方法如下: 选项1: 这甚至不工作,因为我认为只需要do返回工作,然后回答不会在这里工作。 选项 2: 获取运行时异常: 错误!Java . lang . runtime exception:org . mock ITO . exceptions . misusing . wrongtypeofrentvalue:ReturnsArgumentAt不能由getP

  • 我试着做一个ArrayList,包含另一个类的对象,一个名字,还有turn。类似于python字典的东西。 所以我做了一个有三个值的类。 我试图在主类的构造函数中调用它,如下所示: 但它引发了一个错误:无法推断ArrayList的类型参数