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

精确的重载解析过程--为什么f(1)对f(int...arg)和f(long...arg)的调用没有歧义?

长孙骏
2023-03-14

我觉得这些都是适用的:

JLS 15.12.2.4。阶段3:通过变量调用确定适用的方法

JLS 15.12.2.5。选择最具体的方法

void f(Integer... arg) { System.out.println("Integer..."); }

void f(int... arg) { System.out.println("int..."); }

void test() {
    f((short)1); // int... called 
    f(1); // c.ERR
    null
  • int...(找到完全匹配,但不要停下来,继续搜索!)
  • 长…,浮…,双…(不匹配=>尝试拳击)
  • 整数...(现在不明确)、number...、object...

由于发现了两个可能的匹配-我们有一个编译错误。

void f(long... arg) { System.out.println("long..."); }

void f(int... arg)  { System.out.println("int..."); }

void test() {
    f((byte)1); // int... called 
    f(1);       // int... called 
}

f(byte)-第三阶段(varargs)=>尝试以下步骤:

    null

我似乎明白15.12.2。编译时步骤2:确定方法签名。但是在我的例子中,我们有“第三阶段(§15.12.2.4)允许重载与可变度方法、装箱和解装箱相结合。”-但这是一个细节问题。

共有1个答案

琴修为
2023-03-14

至于评论

要使一个参数比另一个参数更具体,该参数的类型必须是另一个方法参数的子类型。

请注意,这适用于基元类型,请参见https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10规范中给出的关系意味着int是比long更具体的类型。

 类似资料:
  • 这是一个示例运行: 根据需要输入任意数量的整数。输入 0 停止。 返回 输入的负整数数。 正整数输入的数量。 总和。 意味 着。输入整数:8 输入整数:6 输入整数:20 输入整数: -2 输入整数:0 正数为:3 负数为:1 总数为:32 平均值为:8$00 我的问题就在底部:当我为中间没有特殊字符的浮点数指定%.2f时,是8$00。arg mean的期望输出是“8.00”。我把所有的代码都贴了

  • 问题内容: 今天,我正在为即将参加的Java考试而学习,但遇到了这个问题: 设一个定义如下的类: 该指令产生的输出是什么? 答案似乎是,但我不明白为什么。有人可以给我适当的解释吗? 问题答案: 与具有可变参数列表的函数相比,重载解析始终偏向于使用具有明显数量的参数的函数,即使这意味着该函数是自动装箱的。 更详细地说,根据JLS 15.12.2 选择具有此优先级的函数: 类型加宽 自动装箱 可变参数

  • 在这篇文章之后——docker:“build”需要一个参数。请参阅“docker build--help”,我试图在Mac 10.13.6上使用一个非传统名称(“local.Dockerfile”)的文件来构建我的docker映像。我试过下面的方法 但docker让我窒息了。我运行的是19.03.5版。

  • 本文向大家介绍F# 0元组有什么用?,包括了F# 0元组有什么用?的使用技巧和注意事项,需要的朋友参考一下 示例 2元组或3元组表示一组相关项。(2D空间中的点数,颜色的RGB值等。)1元组不是很有用,因为可以很容易地将其替换为单个1 int。 一个0元组似乎毫无用处,因为它绝对不包含任何东西。但是它具有的特性使其在F#等功能语言中非常有用。例如,0元组类型只有一个值,通常表示为()。所有0元组都

  • \f

    描述 (Description) 字符\f匹配换页符。 例子 (Example) 以下示例显示了字符匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CharactersDemo { private static final St

  • F#

    F#是由微软发展的为微软.NET语言提供运行环境的程序设计语言,是函数编程语言(FP,Functional Programming),函数编程语言最重要的基础是Lambda Calculus。它是基于OCaml的,而OCaml是基于ML函 数程式语言。有时F# 和 OCaml 的程式是可以交互编译的。 F#已经接近成熟,支援Higher-Order Function、Currying、Lazy E