C ++与Java中函数重载的歧义

时间:2016-04-30 05:32:49

标签: java c++ overloading

在C ++中的函数重载的情况下,我们知道在实际和形式参数不匹配方面可能会出现歧义。所以有一种解决这个问题的机制。

For every actual parameter P, Si be the set of corresponding formal parameters that matches best. then S will be the intersection of all Si.

为此,有4种规则。

  1. 完全匹配
  2. 促销
  3. 标准转换
  4. 用户定义转换
  5. 省略号(不被所有人考虑)
  6. Java也会出现类似的过程吗?由于Java的情况下函数重载的规则是相同的,因此这里也可能出现歧义的类型。

1 个答案:

答案 0 :(得分:3)

类似的过程?那么,取决于“相似”的意思。

然而,Java语言规范中有详细记载 第15.12 Method Invocation Expressions章 尤其是分章15.12.2. Compile-Time Step 2: Determine Method Signature

  

确定适用性的过程首先要确定可能适用的方法(§15.12.2.1)。

     

该过程的其余部分分为三个阶段,以确保与Java SE 5.0之前的Java编程语言版本兼容。阶段是:

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

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

  4.   
  5. 第三阶段(§15.12.2.4)允许重载与变量arity方法,装箱和拆箱相结合。

  6.         

    在泛型方法(§8.4.4)的情况下,确定方法是否适用将需要分析类型参数。可以显式或隐式传递类型参数。如果它们是隐式传递的,那么必须从参数表达式中推断出类型参数的边界(§18 (Type Inference))。

         

    如果在适用性测试的三个阶段之一中确定了几种适用的方法,则选择最具体的方法,如§15.12.2.5部分所述。

15.12.2.5 Choosing the Most Specific Method章总结了很多:

  

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

     

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。

当然,它有点复杂。