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

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

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

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类型是不明确的”


长风秋雁
浏览 374回答 3
3回答

哈士奇WWW

null是一个String变量,指向什么?可以将空引用转换为任何类类型的表达式。所以在这种情况下String,这很好:String x = null;String选择此处的重载是因为Java编译器根据JLS的第15.12.2.5节选择最具体的重载。特别是:非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。在第二种情况下,两种方法仍然适用,但既不是String也不StringBuffer比另一种更具体,因此两种方法都不比另一种方法更具体,因此编译器错误。

SMILET

此外,JLS 3.10.7还声明“null”是“null类型”的文字值。因此存在一种称为“null”的类型。稍后,JLS 4.1声明存在一个无法声明变量的null类型,但您只能通过null文本使用它。后来它说:null引用总是可以进行任何引用类型的扩展引用转换。为什么编译器选择将它扩展为String可能会在Jon的答案中解释。

呼啦一阵风

要回答标题中的问题:null既不是a String也不是a Object,但可以指定对其中任何一个的引用null。我真的很惊讶这个代码甚至编译。我之前尝试过类似的东西,但我收到编译错误,说这个调用是模棱两可的。但是,在这种情况下,似乎编译器正在选择食物链中最低的方法。假设您需要方法的最不通用版本以帮助您。我将不得不看看我是否可以挖掘出这个(貌似)完全相同的情况下我遇到编译器错误的例子,尽管...]编辑: 我明白了。在我制作的版本中,我有两个重载方法接受a String和a Integer。在这种情况下,没有“最具体”参数(如Object和String),因此它不能在它们之间进行选择,这与您的代码不同。很酷的问题!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java