当前位置: 首页 > 知识库问答 >
问题:

歧义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");
    }
}

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

共有1个答案

吕亮
2023-03-14

过载解决方案(JLS 15.2.2)中使用了3个阶段:

>

  • 第一阶段(§15.12.2.2)执行重载解析,而不允许装箱或取消装箱转换,也不允许使用可变度方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。

    第二阶段(§15.12.2.3)在允许装箱和解装箱的同时执行重载解析,但仍然排除了可变度方法调用的使用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。

    m2不是泛型的,m1和m2通过变量性调用而适用,其中m1的前k个变量性参数类型是S1,…,Sk,m2的前k个变量性参数类型是T1,…,Tk,对于所有i(1≤i≤k)的参数ei,类型Si比Ti更具体。另外,如果m2有K+1个参数,那么m1的K+1'可变度参数类型是m2的K+1'可变度参数类型的子类型。

    在您的例子中,您有两个非泛型方法,它们可以通过变量调用来应用(即,它们都有varargs)。为了在调用方法(1)时选择其中一个方法,其中一个方法必须比另一个更具体。在您的情况下,每个方法只有一个参数,并且为了使其中一个参数比另一个参数更具体,该参数的类型必须是另一个方法参数的子类型。

    由于int不是integer的子类型,并且integer不是int的子类型,所以这两个方法都不比其他方法更具体。因此,the method方法(int[])对于类型测试错误是不明确的。

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

  •  类似资料:
    • 本文向大家介绍Java Varargs中的方法重载和歧义,包括了Java Varargs中的方法重载和歧义的使用技巧和注意事项,需要的朋友参考一下 在Java中使用变量参数时存在歧义。发生这种情况是因为两种方法绝对可以有效地被数据值调用。因此,编译器不知道该调用哪种方法。 示例 输出结果 名为Demo的类定义了一个名为“ my_fun”的函数,该函数采用可变数量的浮点值。使用“ for”循环将这些

    • 问题内容: 今天就去旅行。我注意到我可以将结构文字传递给与指向结构的指针关联的方法,反之亦然。为什么允许这样做? 输出: 问题答案: 请参阅方法集: 一个类型可能具有与之关联的方法集(§接口类型,§Method声明)。接口类型的方法集是其接口。其他任何类型T的方法集都包含接收者类型T的所有方法。相应指针类型 T的方法集是接收者 T或T的所有方法的集合(也就是说,它还包含T)。进一步的规则适用于包含

    • 问题内容: public static void main(String… args){ then(bar()); // Compilation Error } 编译结果(从命令行) 为什么这种方法模棱两可?该代码在Java 7下成功编译! 将方法栏更改为: 编译没有任何问题,但是在IntelliJ Idea中报告为错误(无法解析method )。 此代码在Java 7下失败- : Java版本

    • 问题内容: 这是一个无法编译的代码示例: 有人可以告诉我这些方法模棱两可的原因吗?先感谢您。 问题答案: 考虑方法签名 和 在装箱和拆箱之前,通话不会是模棱两可的。为了确保与Java的早期版本兼容,该调用将保持明确。因此,重载解决方案的第一阶段不允许装箱,拆箱或可变Arity调用,这些操作都是在同一时间引入的。可变Arity调用是通过为最后一个参数(而不是数组)传递参数序列来调用varargs方法

    • 为什么不能正确解析?我能给它指示吗? 解析代码:

    • 我有点迷茫,正在尝试实施话题交流,不确定需要什么。 我想有几个路由键和一个主题交换(默认的amq.topic)。我的钥匙是: 创建customer.app 创建customer.app 客户。*.创建 我希望我的队列是持久的,但是我需要1个“客户”队列还是2个appA和appB队列?我已经弄清楚了我的发布者;连接、交换声明、基本发布。 但我正在与消费者斗争。假设我想打开3个控制台,上面提到的每个路