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

Varargs Java模糊调用

凌智
2023-03-14
问题内容

我对Java的 varargs 方法有些困惑:

public static int sum(int ...a) {
    return 0;
}

public static double sum(double ...a) {
    return 0.0;
}

当我尝试在sum()不传递任何参数的情况下进行调用时,将int调用方法的版本。我不明白为什么;通常,编译器必须引发错误。

相比之下,当我尝试sum不带任何参数的情况下,以下代码会生成编译器错误:

public static int sum(int ...a) {
    return 0;
}

public static boolean sum(boolean ...a) {
    return true;
}

问题答案:

这里适用的一般规则是:如果一个方法签名严格比另一个方法签名 更具体 ,则Java选择它时不会出错。

从直觉上讲,如果您可以完全删除一个方法签名,则该方法签名更为具体,而另一个较不具体的方法签名将适用于每个现有调用。

当在签名sum(int... args)sum(double... args)签名之间进行选择时,签名sum(int... args)更为具体,因为对该方法的任何调用也可以通过sum(double... args)应用扩展转换而传递给该方法。对于sum(boolean... args)不能进行类似转换的方法而言,情况并不相同。

Java语言规范,SE 8版本:

15.12。方法调用表达式

15.12.2.5。选择最具体的方法

Java编程语言使用选择 最具体 方法的规则。

如果满足以下任一条件,则对于使用参数表达式e1,…,ek的调用,一个适用的方法m1比另一适用的方法m2更具体:

* m2不是通用的,并且m1和m2可通过严格或松散调用来应用,并且m1具有形式参数类型S1,…,Sn,而m2具有形式参数类型T1,…,Tn,则类型Si
对于所有i(1≤i≤n,n = k),自变量ei比Ti 特定


如果S <:T(第4.10节),则对于任何表达式,类型S都比类型T更具体。

4.10。子类型化

4.10.1。基本类型之间的子类型化

双> 1浮点

浮动> 1长

long> 1 int



 类似资料:
  • 我正在使用Eclipse集成的ProGuard来混淆我的应用程序APK。 我已尝试为应用程序导出签名包。APK已安装,但无法正常工作(有无Proguard混淆) 但是,eclipse生成了一个带调试符号的APK,它工作得非常好。有什么办法可以混淆那个APK吗? 我需要得到一个正常工作的签名,混淆的APK不是为了发布,但内部共享。

  • 注意: Internet Explorer和Safari不支持SVG滤镜! <defs> 和 <filter> 所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义。 <filter>标签用来定义SVG滤镜。<filter>标签使用必需的id属性来定义向图形应用哪个滤镜? SVG <feGaussianBlur> 实例 1 <feGaussianBlu

  • 我正在用Android编写一些Junit测试,如果我这样做: 我得到一个不明确的方法调用错误。 方法调用不明确:AssertEquals(int,int)和AssertEquals(Object,Object)都匹配 然而,如果我这样做: 它起作用了。我觉得第二个函数应该做完全相同的事情。 这是怎么回事?

  • [ ] 查询包含马的学生 // 查询姓名包含马的学生 const { field = '' } = ctx.query const fields = field.split(';').filter(f =&gt; f) Student.findAll({ attributes: fields.length === 0 ? '' : fields, where: { name:

  • If you take a look at Cheat Sheet, you’ll find that there are too many CSS snippets to remember. Also, some of them might be a bit lengthy for sake of logical separation. 看一看 速查表,会发现要记的 CSS 代码片断太多了。一些

  • 这一章将会演示教你如何写一个属于自己的Fuzz测试脚本,当我们进行exploit研究和开发的时候就可以使用脚本语言发送大量的测试数据给受害者机器,但是这个错误数据很容易引发应用程序崩溃掉。而Python却不同,当程序崩溃之后,此时你的程序会暂时断开连接,随后会立即创建一个新的连接继续执行。 下面我们首先要解决的问题是应用程序如何处理用户输入的内容,因为在进行模糊测试的时候,我们会不定时的想到一些新