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

模糊varargs方法

云长恨
2023-03-14
问题内容

这是一个无法编译的代码示例

public class Test {
    public static void main(String[] args) {
        method(1);
    }

    public static void method(int... x) {
        System.out.println("varargs");
    }

    public static void method(Integer... x) {
        System.out.println("single");
    }
}

有人可以告诉我这些方法模棱两可的原因吗?先感谢您。


问题答案:

考虑方法签名

public static void foo(int a)

public static void foo(Integer a)

在装箱和拆箱之前,通话foo(1)不会是模棱两可的。为了确保与Java的早期版本兼容,该调用将保持明确。因此,重载解决方案的第一阶段不允许装箱,拆箱或可变Arity调用,这些操作都是在同一时间引入的。可变Arity调用是通过为最后一个参数(而不是数组)传递参数序列来调用varargs方法时。

但是,method(1)方法签名的解析允许装箱和拆箱,因为这两种方法都需要可变的arity调用。由于允许装箱,因此两个签名均适用。通常,当应用两个重载时,会选择最具体的重载。但是,您的签名都不比其他签名更具体(因为两者int都不Integer是子类型)。因此,通话method(1)是不明确的。

您可以通过传递new int[]{1}来进行编译。



 类似资料:
  • 问题内容: 我对Java的 varargs 方法有些困惑: 当我尝试在不传递任何参数的情况下进行调用时,将调用方法的版本。我不明白为什么;通常,编译器必须引发错误。 相比之下,当我尝试不带任何参数的情况下,以下代码会生成编译器错误: 问题答案: 这里适用的一般规则是:如果一个方法签名严格比另一个方法签名 更具体 ,则Java选择它时不会出错。 从直觉上讲,如果您可以完全删除一个方法签名,则该方法签

  • 1)创建groovy项目 2)创建接口: 3)创建spock测试: 有没有更好的方法来“解释”spock被模仿函数的最后一个参数是vararg,因此可以省略它?

  • 有人能告诉我这些方法模棱两可的原因吗?提前谢谢你。

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

  • 本文向大家介绍python模糊图片过滤的方法,包括了python模糊图片过滤的方法的使用技巧和注意事项,需要的朋友参考一下 最近在做人脸识别清洗样本的工作,发现经过人脸对齐后存在部分图片十分模糊,所以用opencv滤了一下。 原理就是使用了cv2.Laplacian()这个方法,代码如下。图片越模糊,imageVar的值越小,图像越模糊。 以上这篇python模糊图片过滤的方法就是小编分享给大家的

  • 给定这个Java类: 给出以下Java代码: 我得到了这个输出:[值:1,值:2,值:3] 当我运行这段代码时: 我期望得到输出[Value:1,Value:4,Value:9],但我得到了[Value:1,Value:2,Value:3],所以列表中的元素没有被修改。 但是当我运行这个时: 这是: 我两次都得到了我期望的输出([Value: 1, Value: 4, Value: 9]) 为什么