如何对空参数进行方法重载?

How to do method overloading for null argument?

提问人:Phani 提问时间:3/8/2011 最后编辑:2240Phani 更新时间:10/6/2022 访问量:99547

问:

我添加了三个带参数的方法:

public static  void doSomething(Object obj) {
    System.out.println("Object called");
}

public static  void doSomething(char[] obj) {
    System.out.println("Array called");
}

public static  void doSomething(Integer obj) {
    System.out.println("Integer called");
}

当我调用时,编译器会将错误抛出为模棱两可的方法。那么问题就是因为和方法还是方法?doSomething(null)Integerchar[]IntegerObject

java oop null 重载

评论

3赞 Mudassir 3/8/2011
只需将 更改为 .Integerint
2赞 Joachim Sauer 3/8/2011
@Mudassir:这究竟能解决什么问题?
2赞 Phani 3/8/2011
@Joachim Sauer:如果从 Integer 更改为 int,则 null 不会引用 Java 中的基元类型,因此编译器不会抛出错误。
0赞 Mudassir 3/8/2011
@Joachim Sauer:它不会抛出错误。reference to doSomething is ambiguous

答:

8赞 Lars Noschinski 3/8/2011 #1

null是这三种类型中的任何一种的有效值;因此,编译器无法决定使用哪个函数。改用类似 or 的东西。doSomething((Object)null)doSomething((Integer)null)

评论

0赞 Phani 3/8/2011
我删除了带有 Integer 参数的方法,它调用函数并将输出返回为“Array Called”,那么 Array 和 Object 之间的契约是什么?
3赞 Zds 3/8/2011
Java 数组也是对象。
55赞 jmg 3/8/2011 #2

当使用参数调用时,这三种方法中的每一对本身都是模棱两可的。因为每个参数类型都是引用类型。null

以下是使用 null 调用您的一个特定方法的三种方法。

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

如果您真的打算使用参数调用这些方法,我是否可以建议删除这种歧义。这样的设计会在将来招致错误。null

评论

1赞 kajacx 8/11/2015
只有 - pair 是模棱两可的,因为在其他两种情况下,Java 编译器可以选择最具体的选择,就像@JoachimSauer描述的那样。Integerchar[]
2赞 jmg 9/15/2015
@kajacx:OP 最初的问题是使用 as 参数调用这些方法。在这个前提条件下,所有三对都是模棱两可的。对于一般情况,我同意只有一对是模棱两可的。nullInteger - char[]
0赞 Sameer 11/7/2016
对于这将返回调用的字符串。doSomething(null)public static void doSomething(String str) { System.out.println("String called"); }
0赞 peterk 7/19/2017
是否可以使用像“nullable”或“not nullable”这样的注释并设置声明,以便只有您想要获取 null 的一个方法,以便显式“null”(但隐式 null 类型)参数始终明确地选择特定的重载?
2赞 Ankit 3/8/2011 #3

Java 中的每个类都扩展了 Object 类。甚至 Integer 类也扩展了 Object。因此,Object 和 Integer 都被视为 Object 实例。因此,当您将 null 作为参数传递时,编译器会混淆要调用哪个对象方法,即使用参数 Object 或参数 Integer,因为它们都是对象并且它们的引用可以为 null。但是 java 中的原语并没有扩展 Object。

254赞 Joachim Sauer 3/8/2011 #4

Java 将始终尝试使用可用的方法的最具体适用版本(参见 JLS §15.12.2)。

Object,并且都可以作为有效值。因此,所有 3 个版本都适用,因此 Java 必须找到最具体的版本。char[]Integernull

由于是 的超类型,数组版本比 -version 更具体。因此,如果仅存在这两种方法,则将选择版本。Objectchar[]Objectchar[]

当 和 版本都可用时,它们都比另一个版本更具体,但没有一个版本比另一个版本更具体,因此 Java 无法决定调用哪一个。在这种情况下,您必须通过将参数转换为适当的类型来明确提及要调用的参数。char[]IntegerObject

请注意,在实践中,这个问题的发生比人们想象的要少得多。这样做的原因是,仅当您显式调用带有或带有相当非特定类型的变量(例如)的方法时,才会发生这种情况。nullObject

相反,以下调用是完全明确的:

char[] x = null;
doSomething(x);

尽管您仍在传递值,但Java确切地知道要调用哪个方法,因为它将考虑变量的类型。null

评论

1赞 Christian Gosch 2/13/2015
这是针对 Java 7 所述的。这是否也适用于以前的 Java 版本?我的意思是:如果您有几个方法签名,其参数仅沿类型层次结构,那么您将 null 作为实际值进行保存?如果你已经建立了一个“层次结构”,就像这里的例子一样,那么你不是吗?
4赞 Joachim Sauer 2/13/2015
我很确定这些规则至少在 Java 1.1 以来的所有内容中都是相同的(显然,除了添加泛型)。
1赞 Sameer 11/10/2016
Does this mean that if compiler were to choose in between doSomething(String str) and doSomething(Object obj) during runtime with doSomething(null), doSomething(String str) will be called.
1赞 Jafar Ali 7/30/2014 #5

I Have tried this and when there is exactly one pair of overloaded method and one of them has a parameter type Object then the compiler will always select the method with more specific type. But when there is more than one specific type, then the compiler throws an ambiguous method error.

Since this is a compile time event, this can only happen when one intentionally passes null to this method. If this is done intentionally then it is better to overload this method again with no parameter or create another method altogether.

0赞 chitrendra chaudhary 11/4/2017 #6

there is an ambiguity because of and .doSomething(char[] obj)doSomething(Integer obj)

char[] and Integer both are the same superior for null that's why they are ambiguous.

0赞 nagarjuna chimakurthi 8/4/2018 #7
class Sample{
  public static void main (String[] args) {
       Sample s = new Sample();
       s.printVal(null);

    } 
    public static void printVal(Object i){
        System.out.println("obj called "+i);
    }

    public static void printVal(Integer i){
        System.out.println("Int called "+i);
    }
}

The output is Int called null and so ambiguity is with char[] and Integer

评论

0赞 Rajesh Patel 9/22/2021
Do you have idea why this method will called public static void printVal(Object i){ System.out.println("obj called "+i); }