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

当参数是文本空值时,如何选择重载方法?

邢飞鸿
2023-03-14

我在一次测验中遇到了这个问题,

public class MoneyCalc {

   public void method(Object o) {
      System.out.println("Object Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

这个程序的输出是“String Version”。但我无法理解为什么将null传递给重载方法会选择字符串版本。null是指向任何内容的String变量吗?

但是,当代码更改为时,

public class MoneyCalc {

   public void method(StringBuffer sb) {
      System.out.println("StringBuffer Verion");
   }

   public void method(String s) {
      System.out.println("String Version");
   }

   public static void main(String args[]) {
      MoneyCalc question = new MoneyCalc();
      question.method(null);
   }
}

它给出了一个编译错误,说“方法方法(StringBuffer)对于MoneyCalc类型是模糊的”

共有3个答案

章涵蓄
2023-03-14

您可以将字符串指定给空值,使其有效,并且java和大多数编程语言的顺序适合于最接近的类型,然后适合于对象。

山疏珂
2023-03-14

此外,JLS 3.10.7还声明“null”是“null类型”的文字值。因此存在一种称为“null”的类型。

稍后,JLS 4.1声明存在一个null类型,它不可能声明变量,但您只能通过null文本使用它。后来它说:

空引用始终可以进行扩展引用转换为任何引用类型。

Jon的回答很好地解释了编译器为什么选择将其扩展为字符串。

弘烨烁
2023-03-14

null是一个不指向任何内容的字符串变量吗?

空引用可以转换为任何类类型的表达式。所以在String的情况下,这很好:

String x = null;

根据JLS第15.12.2.5节,选择此处的字符串重载是因为Java编译器选择了最具体的重载。特别地:

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

在您的第二种情况下,两种方法仍然适用,但StringStringBuffer都没有比另一种更具体,因此两种方法都没有比另一种更具体,因此编译器错误。

 类似资料:
  • 问题内容: 我在测验中遇到了这个问题, 该程序的输出为“字符串版本”。但是我不明白为什么将null传递给重载方法会选择字符串版本。字符串变量null是否指向空? 但是,当代码更改为 它给出了一个编译错误,指出“对于MoneyCalc类型,方法method(StringBuffer)是不明确的” 问题答案: 字符串变量null是否指向空? 空引用可以转换为任何类类型的表达式。因此,对于,这很好: 选

  • 问题内容: 给出以下代码: 输出(意外)如下: 问题出在第一行,我希望与其他两行相同。此外,我发誓直到最近,编译器仍会为我的普通调用给出模糊的调用警告。但是,使用Java 5和6进行编译和测试会产生相同的结果。 这对我来说是一个重要的问题,因为我有很多代码都使用这种模式,即使用不同类型的重载“默认”参数来选择返回类型并推断所需的转换/解析。谁能解释这是怎么回事? 问题答案: Java始终以相同的方

  • 问题内容: 我正在尝试以下代码: 打印三遍。我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?是否有修改此代码,以便它会打印的方式, 问题答案: 我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗? 是。您的期望是错误的。在Java中,动态方法分派仅发生在调用方法的对象上,而不发生在重载方法的参数类型上。 引用Java语言规范: 调用方法时(第15.12节),实际参数

  • 问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅

  • 当作为参数传递时,为什么调用具有类型为的参数的方法,而不是调用具有类型为的参数的方法?

  • 这是在参数是重载函数时重载解析如何工作中提到的更复杂的问题? 下面的代码编译起来没有任何问题: 模板参数推导似乎不是一项具有挑战性的任务-只有一个函数接受两个参数。但是,取消注释的模板重载(仍然只有一个参数)会无缘无故地破坏编译。gcc 5. x/6. x和clang 3.9的编译都失败了。 它可以用重载解析/模板参数推导规则来解释,还是应该在这些编译器中被限定为缺陷?